IOS面试之block什么时候需要构造循环引用

在网络请求API会持有回调的block,回调的block会持有self,而self也持有网络请求API的话,我们就构造了一个循环引用。虽然我们构造出了循环引用,但是因为网络请求结束时,网络请求API会主动释放对block的持有,因为整个循环链条被解开,循环应用就被打破了,所以不会存在内存泄露问题。

- (void)clearCompletionBlock{
          //nil out to break the retain cycle
          self.successCompletionBlock = nil;
          self.failureCompletionBlock     = nil;
}

总之,解决循环引用问题主要有两个办法:

  • 事前避免,我们在会产生循环引用的地方使用weak弱引用,以避免产生循环引用
  • 事后补救,明确知道会产生循环引用,但是在合理的位置断开环中的一个引用,是的对象得逸回收。

你可能感兴趣的:(IOS面试之block什么时候需要构造循环引用)