一个使用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”。

(全文完)

Block的Retain Cycle的解决方法的更多相关文章

  1. [ios2]警告:Block的Retain Cycle的解决方法 【转】

    <span style="background-color: rgb(248, 248, 248); font-family: 'PT Sans', Geogia, Baskervil ...

  2. elasticsearch报错expected <block end>, but found BlockMappingStart解决方法

    我用的是elasticsearch2.4.0,在修改完配置文件就出现类似格式 expected <block end>, but found BlockMappingStart...... ...

  3. div之间有间隙以及img和div之间有间隙的原因及解决方法

    原因: div 中 存在 img标签,由于img标签的 display:inline-block 属性. display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是因 ...

  4. Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.

    Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现. 1.Block语法总结及示例如下:         //1.普通代码块方式bloc ...

  5. img和div之间有间隙的原因及解决方法

    div 中 存在 img标签,由于img标签的 display:inline-block 属性. #####display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是 ...

  6. 解决NSTimer循环引用Retain Cycle问题

    解决NSTimer循环引用Retain Cycle问题 iOS开发中以下的情况会产生循环引用 block delegate NSTimer 循环引用导致一些对象无法销毁,一定的情况下会对我们横须造成影 ...

  7. xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cycle” in ARC-enabled code

    xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cyc ...

  8. 处理Block中的self问题(Capturing 'self' strongly in this block is likely to lead to a retain cycle)

    警告:ARC Retain Cycle Capturing 'self' strongly in this block is likely to lead to a retain cycle 代码: ...

  9. python中IndentationError: expected an indented block错误的解决方法

    IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进

随机推荐

  1. Ubuntu 奇怪踩坑记录

    仓库ppa问题 当你使用 apt-get update 时候,提示 仓库 "http://ppa.launchpad.net/hzwhuang/ss-qt5/ubuntu bionic Re ...

  2. WordPress .gitignore

    # ----------------------------------------------------------------- # .gitignore for WordPress @salc ...

  3. loj2000[SDOI2017]数字表格

    题意:f为Fibnacci数列.求$\prod_{1<=i<=n,1<=j<=m} f[gcd(i,j)]$. n,m<=1e6. 标程: #include<bit ...

  4. Java语法清单-快速回顾(开发)

    Java CheatSheet 01.基础 hello,world! public static void main(String[] args) { System.out.println(" ...

  5. sqoop简介和原理分析

    Sqoop简介 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL , ...

  6. NOIp2018集训test-9-21(am/pm)

    Am DAY1 抄代码 送分题 //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++ ...

  7. cdq分治·三维偏序问题

    转载自FlashHu大佬的博客CDQ分治总结(CDQ,树状数组,归并排序),在讲述部分有部分删改,用了自己的代码 CDQ分治的思想 CDQ分治是基于时间的离线分治算法.这一类分治有一个重要的思想——用 ...

  8. JVM内核-原理、诊断与优化学习笔记(十):Class文件结构

    文章目录 语言无关性 文件结构 魔数 版本 常量池 CONSTANT_Utf8 CONSTANT_Integer CONSTANT_String CONSTANT_NameAndType CONSTA ...

  9. jquery click事件失效

    除了最基本的语法错误,还可能是因为,元素根本点击不到. z-index:99;

  10. Spring源码由浅入深系列四 创建BeanFactory

    继上一章refresh之后,上图描述了obtainFreshBeanFactory过程.