ios block常见的错误(二)——循环引用
2019独角兽企业重金招聘Python工程师标准>>>
这篇博文继续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的常见错误
转载于:https://my.oschina.net/u/2361492/blog/529181
ios block常见的错误(二)——循环引用相关推荐
- iOS之深入解析如何检测“循环引用”
一.前言 Objective-C 使用引用计数作为 iPhone 应用的内存管理方案,引用计数相比 GC 更适用于内存不太充裕的场景,只需要收集与对象关联的局部信息来决定是否回收对象,而 GC 为了明 ...
- C2146和C4430错误:循环引用错误
今天编译程序的时候发生了C2146和C4430错误: 1>e:/rt21/src/dbms/db_warn_server/db_warn.h(30) : error C2146: 语法错误 : ...
- 如何避免在Block里用self造成循环引用
原文:http://blog.csdn.net/zhangao0086/article/details/38273239 一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调 ...
- iOS开发笔记(二):block循环引用
写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...
- iOS循环引用问题集合、内存泄漏、僵尸对象、代码静态分析
内存泄漏:https://my.oschina.net/llfk/blog/1031291 内存泄漏监测自动化:http://www.cocoachina.com/articles/18490 fac ...
- block(六)循环引用-b
在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.theBloc ...
- Block 的循环引用
Block是在栈上生成的,所以一般使用copy方法把Block复制到堆上,避免Block被立刻释放. Block会对内部的变量形成强引用,而如果同时该变量又持有这个Block,就会导致循环引用而无法释 ...
- iOS容易造成循环引用的三种场景,就在你我身边!
ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是--循环引用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都同 ...
- nstimer循环引用_ios开发中经典循环引用场景?
1.属性传值循环引用 如:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexP ...
最新文章
- Java多线程(九)—— interrupt()和线程终止方式
- 【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )
- Linux下 ln 命令详解
- Oracle学习之merge
- 把Rust和Servo引入Firefox
- 网络游戏仅可在规定时间向未成年人提供1小时服务
- 海量数据解决方案,知多少?
- [附源码]Java计算机毕业设计SSM餐厅订餐系统
- hfss matlab api 天线,应用HFSS-MATLAB-API设计圆极化微带天线
- MATLAB数据拟合中的若干问题(待续)
- 文本聚类 java_【Java】文本聚类
- 车载android 电源管理
- 手把手学会gitbub(4)
- php ios表情包,[iOS] 自定义表情包
- 更换固态硬盘和机械硬盘以及重装系统
- 秋招详细攻略——从准备到面试
- 抢票软件不该如此抢手
- 【图像超分辨】RDN
- 你可以写出优质的个人简介,自媒体个人简介三要三不要,收藏学习
- 手机APP如何监控公司内的在线客服聊天?
热门文章
- android开发中的ANR异常
- 异常检测: 多元高斯分布
- SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;
- Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法
- 微信分享网页链接缩略图不显示解决方法
- 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题
- Java 异常的捕获与处理详解 (一)
- 如何在PHP中使用cURL连接到Tor隐藏服务?
- 为什么要使用Ruby的attr_accessor,attr_reader和attr_writer?
- 在输入文本框中获取值