黑马程序员技术交流社区
标题:
block与self之间的 强引用循环 问题
[打印本页]
作者:
yanggangcl
时间:
2015-11-5 10:35
标题:
block与self之间的 强引用循环 问题
首先要知道block是OC中的一种类型,可以作为property出现在类中,而且在它的语句块中是通过强引用来捕获的变量。
其次要知道类中的property也是被类用强引用指着的。
所以在下面的代码中:
@interface XYZBlockKeeper : NSObject
@property (copy) void (^block)(void);
@end
@implementation XYZBlockKeeper
- (void)configureBlock {
self.block = ^{
[self doSomething];
}; }
... @end
复制代码
self本来指向了block,block又在捕获的过程中指向了self,所以就造成了 strong reference cycles。
这结果是不是似曾相识?
对了,就是和对象之间的强引用循环,或者retain造成的循环一样,都会造成对象最终释放不掉,从而内存泄露。
那怎么破?
对象间的强引用循环的解法是:一端为strong,一端为weak。这个也类似:
- (void)configureBlock {
XYZBlockKeeper * __weak weakSelf = self; //设为弱引用
self.block = ^{
[weakSelf doSomething];
} }
复制代码
就可以啦!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2