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常见的错误(二)——循环引用相关推荐

  1. iOS之深入解析如何检测“循环引用”

    一.前言 Objective-C 使用引用计数作为 iPhone 应用的内存管理方案,引用计数相比 GC 更适用于内存不太充裕的场景,只需要收集与对象关联的局部信息来决定是否回收对象,而 GC 为了明 ...

  2. C2146和C4430错误:循环引用错误

    今天编译程序的时候发生了C2146和C4430错误: 1>e:/rt21/src/dbms/db_warn_server/db_warn.h(30) : error C2146: 语法错误 : ...

  3. 如何避免在Block里用self造成循环引用

    原文:http://blog.csdn.net/zhangao0086/article/details/38273239 一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调 ...

  4. iOS开发笔记(二):block循环引用

    写这篇文章的缘由是第一次面试时被问到了block循环引用的问题,当时回答的不是很好,首先要明确的是,block是否用copy修饰决定不了循环引用的产生,在此再一次进行补强,有不对的地方还请多多指教. ...

  5. iOS循环引用问题集合、内存泄漏、僵尸对象、代码静态分析

    内存泄漏:https://my.oschina.net/llfk/blog/1031291 内存泄漏监测自动化:http://www.cocoachina.com/articles/18490 fac ...

  6. block(六)循环引用-b

    在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.theBloc ...

  7. Block 的循环引用

    Block是在栈上生成的,所以一般使用copy方法把Block复制到堆上,避免Block被立刻释放. Block会对内部的变量形成强引用,而如果同时该变量又持有这个Block,就会导致循环引用而无法释 ...

  8. iOS容易造成循环引用的三种场景,就在你我身边!

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是--循环引用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都同 ...

  9. nstimer循环引用_ios开发中经典循环引用场景?

    1.属性传值循环引用 如:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexP ...

最新文章

  1. Java多线程(九)—— interrupt()和线程终止方式
  2. 【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )
  3. Linux下 ln 命令详解
  4. Oracle学习之merge
  5. 把Rust和Servo引入Firefox
  6. 网络游戏仅可在规定时间向未成年人提供1小时服务
  7. 海量数据解决方案,知多少?
  8. [附源码]Java计算机毕业设计SSM餐厅订餐系统
  9. hfss matlab api 天线,应用HFSS-MATLAB-API设计圆极化微带天线
  10. MATLAB数据拟合中的若干问题(待续)
  11. 文本聚类 java_【Java】文本聚类
  12. 车载android 电源管理
  13. 手把手学会gitbub(4)
  14. php ios表情包,[iOS] 自定义表情包
  15. 更换固态硬盘和机械硬盘以及重装系统
  16. 秋招详细攻略——从准备到面试
  17. 抢票软件不该如此抢手
  18. 【图像超分辨】RDN
  19. 你可以写出优质的个人简介,自媒体个人简介三要三不要,收藏学习
  20. 手机APP如何监控公司内的在线客服聊天?

热门文章

  1. android开发中的ANR异常
  2. 异常检测: 多元高斯分布
  3. SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;
  4. Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法
  5. 微信分享网页链接缩略图不显示解决方法
  6. 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题
  7. Java 异常的捕获与处理详解 (一)
  8. 如何在PHP中使用cURL连接到Tor隐藏服务?
  9. 为什么要使用Ruby的attr_accessor,attr_reader和attr_writer?
  10. 在输入文本框中获取值