Block

作者: 英雄出少年 | 来源:发表于2018-04-11 22:18 被阅读7次

    1、如果没有对block进行copy操作,block存储于栈空间
    如果对block进行copy操作,block存储于堆空间
    2、如果block存储于栈空间,不会对block内部用到得对象产生强引用,如果block存储于堆空间,会对block内部的对象产生强引用

    
    @interface TGPerson : NSObject
    
    @property (nonatomic, copy) void (^testBlock)();
    - (void) run;
    
    @end
    
    @implementation TGPerson
    
    - (void)dealloc
    {
        NSLog(@"TGPerson---dealloc");
    }
    - (void)run
    {
        NSLog(@"TGPerson---run");
    }
    @end
    
    /******  举例  *****/
     TGPerson *p = [[TGPerson alloc] init];
     p.testBlock = ^{
            [p run];  //产生循环引用
        };
    
    //ARC环境下 解决办法
    __weak typeof(p) weakP = p;
     TGPerson *p = [[TGPerson alloc] init];
     p.testBlock = ^{
            [p run];  //产生循环引用
        };
    
    或 用weak修饰testBlock 
      @property (nonatomic, weak) void (^testBlock)();
    
    //MRC环境下解决方式
    由于MRC环境下没有强引用弱引用区分
    
    __block typeof(p) weakP = p;
     TGPerson *p = [[TGPerson alloc] init];
     p.testBlock = ^{
            [p run];  //产生循环引用
        };
    
    
    
       int age = 10;
        void (^block)() = ^{ // 值捕获
            NSLog(@"age=%d", age);
        };
        age = 20;
        block();
      输出 :age = 10 ;   age 相当于 值传递
    
      __block int age = 10;
        void (^block)() = ^{ // 值捕获
            NSLog(@"age=%d", age);
        };
        
        age = 20;
        
        block();
    输出 :age = 20 ;  age是地址传递
    
    
    

    相关文章

      网友评论

          本文标题:Block

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