一个使用Block语法的实例变量,在引用另一个实例变量的时候,经常会引起retain cycle。这个问题在使ASIHTTPRequest的block语法的时候会时不时的碰到。这个问题困扰了我这个小白很久。终于有一天,在Advanced Mac
OS X Programming上,看到了这个问题的解决方案。

先用代码描述一下症状:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* ViewController.h */
#import <UIKit/UIKit.h> typedef void (^ABlock)(void); //定义一个简单的Block @interface ViewController : UIViewController {
NSMutableArray *_items;
ABlock _block;
} @end /* ViewController.m */ #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,然后用结构体语法访问实例变量。代码如下:

1
2
3
4
__block ViewController *blockSelf = self;
_block = ^{
[blockSelf->_items addObject:@"Hello!"];
};

这么修改之后,blockSelf是本地变量,是弱引用,因此在_blockretain的时候,并不会增加retain
count,所以retain cycle就解除了,Xcode也不再出现警告了,问题解决。

注:本文并非原创,详情请参阅Advanced Mac OS X Programming,第92页“Block Retain Cycles”。

(全文完)

最新文章

  1. python列表副本
  2. Leetcode: Sequence Reconstruction
  3. 怎样获取Windows平台下SQL server性能计数器值
  4. CGFloat Float 互转
  5. ::before/:before和::after/:after的使用
  6. SVG 2D入门10 - 滤镜
  7. hihocoder 1037 数字三角形
  8. Java学习笔记(一):数据类型与变量
  9. 【排障】编译安装Mysql并使用自启动脚本mysqld后报错
  10. Linux进程和进程边界
  11. HTTP协议探析
  12. ZOJ2402 Lenny's Lucky Lotto List 简单DP
  13. CNN网络架构演进
  14. 算法:快速排序实现 &amp; 定制比较函数
  15. mysql恢复备份错误:Got a packet bigger than &#39;max_allowed_packet&#39; bytes
  16. 傅立叶级数(Fourier Series)和周期现象
  17. springboot利用MockMvc测试controller控制器
  18. leetcode-78-子集(用bfs解决)
  19. Setup Factory 读取安装包的配置文件
  20. 维纳滤波和编码曝光PSF去除运动模糊【matlab】

热门文章

  1. Django完成常用四大功能
  2. 从身份证号提取生日并更新到生日字段中的SQL语句
  3. python3添加requests库
  4. java访问https绕过证书信任
  5. vue之自定义插件
  6. jq-在线引入
  7. js自动下载
  8. bzoj1016题解
  9. 线性dp——cf988F
  10. LeetCode 183. Customers Who Never Order (从不订购的客户)