美文网首页
【Objective-c】 Block 基本使用及循环引用分析

【Objective-c】 Block 基本使用及循环引用分析

作者: MR_詹 | 来源:发表于2016-12-08 10:26 被阅读35次

1.0 基本使用

    //声明 一个block,
    //返回类型是NSString
    //block名称:myBlock
    //参数类型:int
    NSString *(^myBlock)(int);
    
    //定义 一个block
    //即调用block需要执行的代码
    myBlock=^(int number){
        return [NSString stringWithFormat:@"%d",number];
    };
    
    //block的调用
    myBlock(2);

2.0 block的闭包

    //声明block,不带参数的
    int (^sumBlock)(void);
    
    //定义并出示化两个变量
    int a=3,b=5;
    
    //定义block
    sumBlock = ^(void){
    
        //可以使用block函数外的变量
        return a+b;
    };
    
    a=5;
    b=10;
    
    //在这里调用block时,block中的回调函数中的a,b的值依然是a=3,b=5
    //因为在定义block时,就已经将a,b变量copy了
    //所以block中的回调函数跟后面的a、b已经是没有关联的
    //还有就是block回调函数中copy的a、b变量都是只读的
    //已经是说不能在block中修改a、b的值
    NSLog(@"%d",sumBlock());
    //输出结果是:8;
    
    //【重点】如果有时候确实需要在block中修改变量时的处理方法
    /*
        解决方法:
                对在block中需要更改的变量中,如a和b,
            在变量的声明前添加一个修饰符:“__block”,这样block
            回调就不是copy a、b变量了,而是复制其引用地址来
            实现访问的,即建立起关联,只要在调用block前,变量的
            修改了,那么在block中的变量响应也被修改了,并且可以在
            block中修改变量的值,如a、b
     */
    __block int c =3,d=5;
    int (^reduce)();
    reduce = ^(void){
        return  d-c;
    };
    c = 4;
    d = 8;
    NSLog(@"====%d",reduce());
    //输出结果:-4;

3.0 block作为参数传递

-(void)testBlock:(NSString *(^)(int))myBlcok
{
}

4.0 typedef 与 block

typedef void(^Myblock)();
@interface ViewController ()
@property (nonatomic,copy) Myblock block;
@end

循环引用分析

小编暂时还没有这个能力分析,但是这里分享一遍博客天口三水羊 ,博主分析的很透彻,但浅显易懂,看完都收益良多,极力推荐各位细细阅读!!!

相关文章

网友评论

      本文标题:【Objective-c】 Block 基本使用及循环引用分析

      本文链接:https://www.haomeiwen.com/subject/cdajmttx.html