在网络请求API会持有回调的block,回调的block会持有self,而self也持有网络请求API的话,我们就构造了一个循环引用。虽然我们构造出了循环引用,但是因为网络请求结束时,网络请求API会主动释放对block的持有,因为整个循环链条被解开,循环应用就被打破了,所以不会存在内存泄露问题。
- (void)clearCompletionBlock{
//nil out to break the retain cycle
self.successCompletionBlock = nil;
self.failureCompletionBlock = nil;
}
总之,解决循环引用问题主要有两个办法:
- 事前避免,我们在会产生循环引用的地方使用weak弱引用,以避免产生循环引用
- 事后补救,明确知道会产生循环引用,但是在合理的位置断开环中的一个引用,是的对象得逸回收。