iOS Block

2019-05-08  本文已影响0人  目染江夏
    //基本数据类型局部变量 (只获取其值;__block 对截获变量进行赋值操作需要添加)
   __block int multiplier = 10;
    //对象类型局部变量 (连同所有权修饰符一同截获)
    __unsafe_unretained id unsafe_obj = nil;
    __strong id strong_obj = nil;
    //局部静态变量  (以指针形式截获局部静态变量)
    static int static_var = 3;
    //全局变量 、静态全局变量 不截获 直接使用

    int(^Block)(int) = ^int(int num){
        multiplier = 2;
        static_var = 4;
        NSLog(@"static_var : %d",static_var);
        return num * multiplier;
    };
    NSLog(@"%d",Block(2));
    multiplier = 4;
 __block 对截获变量进行赋值操作需要添加
 需要添加: 基本数据类型、 对象类型
 不需要添加 :静态局部变量、全局变量、静态全局变量
 __block 修饰的变量变成了对象
 
 __forwarding
 不论存在任何内存位置  都可以顺利访问同一个__block 变量
 
 循环引用
   //1,自循环

     {
     _array = @[@"block"];
    //解决方法
    //__weak NSArray *weakArr = _array;(弱引用)
     _strBlock = ^NSString*(NSString* num){
     return [NSSting stingWithFormat:@"%@%@",num,_array[0]];
     }
     _strBlock("hello");
     }
 //2,MRC下不会产生循环引用,ARC下会产生循环引用,引起内存泄露
     {
     __block MCBlock *blockSelf = self;
     
     _blk = ^int(int num){
    //ARC下解决方法
    // int result =  num * blockSelf.var;
    //blockSelf = nil;(block 长时间不使用还是会造成虚幻引用)
    // return result;
     return num * blockSelf.var;
     };
     _blk(3)
     }
上一篇下一篇

猜你喜欢

热点阅读