IOS中block的循环保留问题解决
来源:互联网 发布:音视频网络编码器 编辑:程序博客网 时间:2024/06/06 06:36
首先在头文件中定义2个实例变量
@interface EGOClass
{
EGOViewController *_egoViewCtrl;
EGOData *_egoData;
}
在.m文件中实现方法,方法中包含代码块
- (void)doSomething
{
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
_egoData = data ;
}];
}
这段代码中存在了保留环,因为_egoViewCtrl实例变量保留了代码块,而在块中又保留了_egoData实例。导致delloc方法不会被调用,实例变量无法释放。ARC有下列解决方法:
1.
- (void)doSomething
{
EGOViewController *egoViewCtrl = [[EGOViewController alloc] init];
[egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
_egoData = data ;
}];
}
2.
- (void)doSomething
{
__weak typeOf weakSelf = self;
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
weakSelf.egoData = data ;
}];
}
3.
- (void)doSomething
{
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
_egoData = data ;
_egoViewCtrl = nil;
}];
}
在非ARC模式下:
- (void)doSomething
{
__block id safeSelf = self;
_egoViewCtrl = [[EGOViewController alloc] init];
[_egoViewCtrl startWithCompletionHandler:^(NSData *data)
{
safeSelf.egoData = data ;
}];
}
- IOS中block的循环保留问题解决
- ios中block的循环引用
- iOS中Block的循环引用问题
- iOS中block的循环引用问题
- iOS Block 中 循环引用的解决
- iOS 中关于block 的循环引用问题
- iOS中Block的引用循环问题 (ARC & non-ARC)
- iOS 解决block中self的循环引用问题
- IOS中的block的retain循环
- iOS Block的循环引用问题
- IOS 如何避免Block的循环引用
- iOS开发之Block的循环引用
- ios开发中使用copy类型的block时,防止循环利用的方法。
- iOS中 block 导致 reference loop "引用循环" 引起的leak
- iOS 中Block的正确使用避免循环引用和Crash
- iOS中block的探究
- iOS中block的探究
- IOS中block的用法
- mac svnx第一次初始化
- eclipse / ADT(Android Develop Tool) 一些方便的初始设置
- 小记
- MySQL 中文插入数据乱码(问号????)ERROR 1366 (HY000)
- 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- IOS中block的循环保留问题解决
- php
- linux下安装redis扩展(phpredis,php5.4.14)
- cmd连接mysql数据库
- android给listview的item设定高度
- 操作系统为什么要分用户态和内核态
- 网页重构中区分IE6、IE7、IE8及标准浏览器的最佳方法
- Processing学习(一)
- java 网络 socket编程 Java核心技术读书笔记