首先要知道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];
-
- } }
复制代码
就可以啦! |
|