关于Block的copy和循环引用的问题

转载 2016年06月02日 09:56:08
在实际开发中,发现使用Block有着比delegate和notification更简洁的优势。于是在目前的项目中大量的使用block。

  在我的头文件我是这样声明使用block的。

[plain] view plaincopy
  1. @interface BrushViewController : BaseViewController  
  2.   
  3. @property (nonatomic, copy) void (^getCardInfo)(NSDictionary *cardInfo);  
  4.   
  5. @end  

我将block声明为copy的原因是在代码块里面我可能会使用一些本地变量。而block一开始是放在栈上的,只有copy后才会放到堆上。

如果加copy属性,当其所在栈被释放的时候,这些本地变量将变得不可访问。一旦代码执行到block这段就会导致bad access。

[html] view plaincopy
  1. brush.getCardInfo=^(NSDictionary *info){  
  2.     [self test];  
  3. };  
像上面这段代码,self其实是一个本地变量而不是block内部变量,如果声明为assign,代码执行到block内部就会出错。

但是这又带来另一个问题,就是self的引用计数+1。这意味着很可能会导致循环引用。self持有brush,brush持有block,block持有self。结果就是内存泄漏。

解决的办法如下:

[plain] view plaincopy
  1. __block CurrentViewController* blockSelf = self;  
  2. brush.getCardInfo=^(NSDictionary *info){  
  3.         [blockSelf test];  
  4. };  

通过这个方式,告诉block这个变量的引用计数不要+1。

如果你使用的是ARC,那么就应该改成下面这样:

[plain] view plaincopy
  1. __weak CurrentViewController* blockSelf = self;  
  2. brush.getCardInfo=^(NSDictionary *info){  
  3.         [blockSelf test];  
  4. };  


关于Block,如果需要了解更多可以参考以下资料:http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/

相关文章推荐

Block的引用循环问题 (ARC & non-ARC)

2010年WWDC发布iOS4时Apple对Objective-C进行了一次重要的升级:支持Block。说到底这东西就是闭包,其他高级语音例如Java和C++已有支持,第一次使用Block感觉满简单好...

IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东西要用__weak

循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东西也要用weak,当控制器想要销毁时,控制器被一个强指针指着,而scrollView添加到控制器view中也被强指...

Block 代码块中循环引用问题

什么是循环引用循环引用指两个对象相互强引用了对方,既retain了对方,从而导致谁也释放不了谁的内存泄漏问题。比如我们在代理中一般用weak来修饰delegate而不用strong,正是因为那样会造成...

iOS: ARC和非ARC下使用Block与循环引用问题

1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非A...

block 循环引用的问题

ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC)。 不同于XCode4可以在创建工程时选择关闭ARC,XCode5在创建的工程是默认开启ARC...

iOS 中关于block 的循环引用问题

NSURL *url = [NSURL URLWithString:@"http://localhost:8080"]; // 2.创建一个请求对象 ASIFormDataR...

block的循环引用,未能及时释放问题

近期在开发过程中,偶尔会发现工程里某个页面的通知(NSNotificationCenter)有时会被执行好几次(ps:在页面已经pop出栈之后继续执行,理论上出栈之后,页面应该被释放,通知在deall...

Block的引用循环问题 (ARC & non-ARC)

2010年WWDC发布iOS4时Apple对Objective-C进行了一次重要的升级:支持Block。说到底这东西就是闭包,其他高级语音例如Java和C++已有支持,第一次使用Block感觉满简单好...

block的循环引用的问题

在我们的编写代码的时候,常常会出现一些循环引用的问题,今天就说说block的循环引用,引起的对象无法被释放的问题先说一下我们验证问题的方法: -1.Navigationcontroller嵌套v...

iOS Block的循环引用问题

block与内存 block的循环引用
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)