众所周知,在block中的对象引用 要用__weak,比如
Person *p = [Person new];
p.block = ^{
NSLog(@"%@", p.name);
};
p.block();
上述做法会循环应用 造成内存泄露,需要写成
Person *p = [Person new];
__weak Person *weakP = *p;
p.block = ^{
NSLog(@"%@", weakP.name);
};
p.block();
这样就不会内存泄露了
但是这样就完了吗?
NO NO 没有
Person *p = [Person new];
__weak Person *weakP = *p;
p.block = ^{
Person *strong = weakP;
dispatch_after(when_dispatch_get_main_queue),^{
NSLog(@"%@", strong.name);
}
};
p.block();
先改为weakP, 在第一个Block中该为strong, 然后第二个Block中用强引用,可以保证在回调第二个Block的时候,Person还活着
所以 在第一个block中将弱引用改为强应用 这样改之后 可以多个嵌套block.