IOS内存泄露分析Retain Cycle的解决方法
来源:互联网 发布:vb集成开发环境 编辑:程序博客网 时间:2024/05/21 07:53
Block Retain Cycle
一个使用Block语法的实例变量,在引用另一个实例变量的时候,经常会引起retain cycle。这个问题在使用ASIHTTPRequest的block语法的时候会时不时的碰到。这个问题困扰了我这个小白很久。终于有一天,在Advanced Mac OS X Programming上,看到了这个问题的解决方案。
先用代码描述一下症状:
#import typedef void (^ABlock)(void); //定义一个简单的Block@interface ViewController : UIViewController { NSMutableArray *_items; ABlock _block;}@end#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
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,然后用结构体语法访问实例变量。代码如下:
__block ViewController *blockSelf = self;_block = ^{ [blockSelf->_items addObject:@"Hello!"];};
这么修改之后,blockSelf是本地变量,是弱引用,因此在_block被retain的时候,并不会增加retain count,所以retain cycle就解除了,Xcode也不再出现警告了,问题解决。
Delegate Retain Cycle
当你的delegate中使用了strong引用delegate时会产生循环retain,导致delegate对象不能得到释放
@property (strong, nonatomic)id<Delegate> delegate;
把strong改成weak就行了。
注:本文并非原创,详情请参阅Advanced Mac OS X Programming,第92页“Block Retain Cycles”。
0 0
- IOS内存泄露分析Retain Cycle的解决方法
- Block的Retain Cycle的解决方法
- 警告:Block的Retain Cycle的解决方法
- 警告:Block的Retain Cycle的解决方法
- Block的Retain Cycle的解决方法
- Block的Retain Cycle的解决方法
- 警告:Block的Retain Cycle的解决方法
- 警告:Block的Retain Cycle的解决方法
- 警告:Block的Retain Cycle的解决方法
- Block的Retain Cycle的解决方法
- iOS 中 retain cycle 的产生
- iOS ARC下的cycle retain
- “内存泄露”问题的分析和解决方法
- Block的Retain Cycle的解决方法 (dealloc不掉用)
- [ios2]警告:Block的Retain Cycle的解决方法 【转】
- retain cycle 的产生
- ARC:retain cycle 导致的一个内存警告问题
- ios app 内存泄露分析
- navicat 获取表结构
- avl树的c++实现
- Bootstrap-table查询刷新,重置页数
- js的settimeout用法总结
- iOS获取沙盒路径
- IOS内存泄露分析Retain Cycle的解决方法
- 程序员素质思考
- linux 基本命令
- 你应该了解的 一些web缓存相关的概念
- ARM裸机程序开发——中断系统
- Android : Builder模式 详解及学习使用
- jquery获取对象在数组对象中的索引值
- delaycall.js 修改表单延迟自动提交的 jQuery / Zepto 插件
- R语言绘图渐进