美文网首页
Block是否循环引用

Block是否循环引用

作者: ZCY_YAM | 来源:发表于2017-10-30 20:30 被阅读7次

    判断block 内部是否循环引:自己持有对象是否持有自己。

    #interface Student :NSobject
    @property(copy,nonatomic) void(^callBlock)(void);
    @end
    -(void)testBlockFunc:(void(^)(void))blockFunc;
    
    1对象不持有block
    @implementation Student
    -(void)testBlockFunc:(void(^)(void))blockFunc
    {
          blockFunc();
          NSLong("Hello");
    }
    @end
    
    2对象持有block
    @implementation Student
    -(void)TestBlockFunc:(void(^)(void))blockFunc
    {
          self.callBlock = [blockFunc copy];
          self.callBlock();
          NSLong("Hello");
    }
    @end
    

    下面生成调用

    @interface ViewController()
    @property(nonatomic,strong)Student*ss
    @end
    @implementation ViewController
    //第一种栈block
    -(void)viewDidLoad{
      Student * student = [Student New];
      [student testBlockFunc:(^){
      self.view...
    }];
    // 这个时候需要weak self;  因为self 不持有student
    }
    
    //第二种 
    -(void)viewDidLoad{
    //testBlockFunc 实现方式为1 
      self.ss = [Student New];
      [self.ss testBlockFunc:(^){
      self.view...
    }];
    //这时候 也不需要weak self  虽然B持有ss   block持有B  但是ss不持有block  不能生成闭环 所以不会循环
    }
    //第三种 
    -(void)viewDidLoad{
    //testBlockFunc 实现方式为2
      self.ss = [Student New];
      [self.ss testBlockFunc:(^){
      self.view...
    }];
    //这时候 需要weak self  虽然B持有ss   block持有B  但是ss持有block  生成闭环 所以会循环 
    }
    @end

    相关文章

      网友评论

          本文标题:Block是否循环引用

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