一个使用Block语法的实例变量,在引用另一个实例变量的时候,经常会引起retain cycle。这个问题在使用ASIHTTPRequest的block语法的时候会时不时的碰到。这个问题困扰了我这个小白很久。终于有一天,在Advanced Mac OS X Programming上,看到了这个问题的解决方案。
先用代码描述一下症状:
1234567891011121314151617181920212223242526272829
/* ViewController.h */ #import <UIKit/UIKit.h>typedefvoid(^ABlock)(void);//定义一个简单的Block@interfaceViewController : UIViewController{NSMutableArray*_items;ABlock_block;}@end/* ViewController.m */ #import "ViewController.h"@implementationViewController-(void)viewDidLoad{[superviewDidLoad];// Do any additional setup after loading the view, typically from a nib._items=[[NSMutableArrayalloc]init];_block=^{[_itemsaddObject:@"Hello!"];//_block引用了_items,导致retain cycle。};}@end
Xcode在编译以上程序的时候会给出一个警告:Captureing ‘self’ strongly in this block is likely to lead to a retain cycle。原因是_items实际上是self->items。_block对象在创建的时候会被retain一次,因此会导致self也被retain一次。这样就形成了一个retain cycle。