黑马程序员技术交流社区

标题: block与self之间的 强引用循环 问题 [打印本页]

作者: yanggangcl    时间: 2015-11-5 10:35
标题: block与self之间的 强引用循环 问题
首先要知道block是OC中的一种类型,可以作为property出现在类中,而且在它的语句块中是通过强引用来捕获的变量。
其次要知道类中的property也是被类用强引用指着的。
所以在下面的代码中:
  1. @interface XYZBlockKeeper : NSObject
  2. @property (copy) void (^block)(void);
  3. @end
  4. @implementation XYZBlockKeeper
  5.   - (void)configureBlock {
  6.     self.block = ^{
  7.           [self doSomething];
  8. }; }
  9. ... @end
复制代码

self本来指向了block,block又在捕获的过程中指向了self,所以就造成了 strong reference cycles。
这结果是不是似曾相识?
对了,就是和对象之间的强引用循环,或者retain造成的循环一样,都会造成对象最终释放不掉,从而内存泄露。
那怎么破?
对象间的强引用循环的解法是:一端为strong,一端为weak。这个也类似:
  1. - (void)configureBlock {
  2.     XYZBlockKeeper * __weak weakSelf = self;  //设为弱引用
  3.     self.block = ^{
  4.         [weakSelf doSomething];   
  5.                                  
  6. } }
复制代码

就可以啦!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2