ios block常见的错误(二)——循环引用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ios block常见的错误(二)——循环引用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1227字,纯文字阅读大概需要2分钟。
内容图文
这篇博文继续block的常见错误——循环引用。
循环引用是很多初学者不能察觉的,其产生的原因,是block中的代码会对对象进行强引用。
读者请阅读示例代码1,并思考示例代码1所创建的对象能否被正常销毁?
示例代码1:
* mark 将代码改为调用self的方法 -(NSMutableArray * (_myBlocks ===-=(^sum)(, ) = ^( x, mark 对象被释放时自动调用 - (
结果是不能正常释放的。读者不妨在xcode中试试。
产生原因在block代码中出现了self:
int(^sum)(int, int) = ^(int x, int y) { return [self sum:x y:y]; };
此时sum的block对self强引用,在加上self对myBlocks强引用:
@property (nonatomic, strong) NSMutableArray *myBlocks;
以及sum block被添加到数组时,会被数组强引用:
[self.myBlocks addObject:sum];
这三个引用之间形成了循环引用,如下图:
循环引用的结果就是对象无法被释放!
碰到这类问题,程序员如何解除循环引用呢?
有以下几种解决方案:
1.在block代码中不要引用self以及其他局部变量;如
int(^sum)(int, int) = ^(int x, int y) { return [self sum:x y:y]; };
修改成
int(^sum)(int, int) = ^(int x, int y) { return x + y; };
2.使用__weak关键字,可以将局部变量声明为弱引用
如:
- (instancetype)init { self = [super init]; if (self) { int(^sum)(int, int) = ^(int x, int y) { return [self sum:x y:y]; }; [self.myBlocks addObject:sum]; } return self; }
修改为:
- (instancetype)init { self = [super init]; if (self) { __weak DemoObj *weakSelf = self; int(^sum)(int, int) = ^(int x, int y) { return [weakSelf sum:x y:y]; }; [self.myBlocks addObject:sum]; } return self; }
block的循环引用就说到这,下一篇继续来讲解block的常见错误
原文:http://my.oschina.net/u/2361492/blog/529181
内容总结
以上是互联网集市为您收集整理的ios block常见的错误(二)——循环引用全部内容,希望文章能够帮你解决ios block常见的错误(二)——循环引用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。