警告:Block的Retain Cycle的解决方法
2015-11-30 15:32
369 查看
<span style="background-color: rgb(248, 248, 248); font-family: 'PT Sans', Geogia, Baskerville, 'Hiragino Sans GB', serif; ">警告:Captureing ‘self’ strongly in this block is likely to lead to a retain cycle</span> 一个使用Block语法的实例变量,在引用另一个实例变量的时候,经常会引起retain cycle。这个问题在使用ASIHTTPRequest的block语法的时候会时不时的碰到。这个问题困扰了我这个小白很久。终于有一天,在Advanced Mac OS X Programming上,看到了这个问题的解决方案。 先用代码描述一下症状: [html] view plaincopy <span style="font-size:18px;">/* ViewController.h */ #import <UIKit/UIKit.h> typedef void (^ABlock)(void); //定义一个简单的Block @interface ViewController : UIViewController { NSMutableArray *_items; ABlock _block; } @end /* ViewController.m */ #import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _items = [[NSMutableArray alloc] init]; _block = ^{ [_items addObject:@"Hello!"]; //_block引用了_items,导致retain cycle。 }; } @end</span> Xcode在编译以上程序的时候会给出一个警告:Captureing ‘self’ strongly in this block is likely to lead to a retain cycle。原因是_items实际上是self->items。_block对象在创建的时候会被retain一次,因此会导致self也被retain一次。这样就形成了一个retain cycle。 解决方法就是,创建一个本地变量blockSelf,指向self,然后用结构体语法访问实例变量。代码如下: [html] view plaincopy __block ViewController *blockSelf = self; _block = ^{ [blockSelf->_items addObject:@"Hello!"]; }; 这么修改之后,blockSelf是本地变量,是弱引用,因此在_block被retain的时候,并不会增加retain count,所以retain cycle就解除了,Xcode也不再出现警告了,问题解决。
相关文章推荐
- IPC-Binder连接池
- 【索引】2015 Multi-University Training Contest
- HTML5 Canvas渐进填充与透明(摘自 http://blog.csdn.net/jia20003/article/details/9251893)
- ping失败,如果在路由表main内没有entry
- Idea创建main函数
- Daily Scrum - 11/30
- 初探glusterfs-处理脑裂(split-brain)状态
- Failed to call ScheduleShutdown in logind, proceeding with immediate shutdown: Access denied
- IMAGE INPAINTING
- 光纤网卡、HBA卡和RAID卡的区别
- 社交媒体中的谣言检测(A11, AAAI2015)
- Container With Most Water
- airodump-ng wlan0mon doesn't work
- RAID基本知识
- Contains Duplicate II
- ITerrainPolygon应用
- CombinedDomainXYPlot
- setContentView(R.layout.activity_main) Error解决方法 .
- Contains Duplicate
- 1090. Highest Price in Supply Chain