Block循环引用的若干问题

202 阅读1分钟

我先定义了一个Person,有个成员变量isMan,重写了他的dealoc方法。 viewController有一个block属性myblock。

@interface Person : NSObject
{
   @public BOOL isMan;
}

- (void)dealloc
{
    NSLog(@"dealloc------%p---------------------",self);
}

Block访问成员变量

  Person* p = [Person new];
  NSLog(@"%p init----------------",p);
   self.myblock = ^(void){
       p->isMan = YES;
    };
0x282d4d880 init----------------

dealloc方法并没有走,证明强引用了,如何消除?大家都知道。 发现报错了stackoverflow.com/questions/1… 应该在block里再声明一个strongself的局部变量,防止block内代码执行过程中第一行对象还在,然后执行到最后一行时突然释放掉。

   Person* p = [Person new];
    NSLog(@"%p init----------------",p);
    __weak typeof(Person*) weakP = p;
    self.myblock = ^(void){
        __strong typeof(Person*) strongP = weakP;
        strongP->isMan = YES;
    };