A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

首先要知道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. } }
复制代码

就可以啦!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马