http://blog.csdn.net/felix9/article/details/9619313

在实际开发中,发现使用Block有着比delegate和notification更简洁的优势。于是在目前的项目中大量的使用block。

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

  1. @interface BrushViewController : BaseViewController
  2. @property (nonatomic, copy) void (^getCardInfo)(NSDictionary *cardInfo);
  3. @end

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

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

  1. brush.getCardInfo=^(NSDictionary *info){
  2. [self test];
  3. };

像上面这段代码,self其实是一个本地变量而不是block内部变量,如果声明为assign,代码执行到block内部就会出错。

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

解决的办法如下:

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


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

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

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

关于Block的copy和循环引用的问题的更多相关文章

  1. Block的copy和循环引用的问题

    在实际开发中,发现使用Block有着比delegate和notification更简洁的优势.于是在目前的项目中大量的使用block. 在我的头文件我是这样声明使用block的. 我将block声明为 ...

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

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

  3. block中如何避免循环引用

    使用 weak–strong dance 技术 block 可以直接引用 self,但是要非常小心地在 block 中引用 self.因为在 block 引用 self,可能会导致循环引用.如下例所示 ...

  4. block使用小结、在arc中使用block、如何防止循环引用

    引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗 ...

  5. Block的使用及循环引用的解决

    Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 1.什么是Block? 说这个问题之前,我先来说一下闭包(Closu ...

  6. block的用法和循环引用

    一.block在OC中的用法可以分为大概一下几种. 1>用于成员属性,保存一段代码,可以替代代理传值. 比如说,创建一个ViewController控制器,点击屏幕就跳转到ModalViewCo ...

  7. iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案

    在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,AR ...

  8. block为什么用copy以及如何解决循环引用

    在完成项目期间,不可避免的会使用到block,因为block有着比delegate和notification可读性更高,而且看起来代码也会很简洁.于是在目前的项目中大量的使用block. 之前给大家介 ...

  9. 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(下)

    深入研究Block捕获外部变量和__block实现原理 EOCNetworkFetcher.h typedef void (^EOCNetworkFetcherCompletionHandler)(N ...

随机推荐

  1. MetaHandler.js:移动端适配各种屏幕

    MetaHandler.js !function () { var opt = function() { var ua = navigator.userAgent, android = ua.matc ...

  2. 李洪强iOS经典面试题124

    1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现 ...

  3. HDU2845 DP

    Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. paramter的添加

    public string GetUserIdByName(string UserName, string pwd)    {        string sql = @"select Na ...

  5. centos6 系统优化脚本

    #!/bin/bash # 检查是否为root用户,脚本必须在root权限下运行 # if [[ "$(whoami)" != "root" ]]; then ...

  6. uilmit 优化

    #!/bin/bash sed -i "/^ulimit -SHn.*/d" /etc/rc.local echo "ulimit -SHn 102400" & ...

  7. Python 进阶 - 正则表达式

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  8. c++ basic 整理2

    ​//拷贝函数 //拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量. //不显式指定拷贝函数时,编译器会生成默认拷贝函数. //使用默认拷贝函数 ...

  9. javascript保留关键字

    1.通用保留关键字 break delete function return typeof case do if switch var catch else in this void continue ...

  10. BizTalk动手实验(十五)AS2消息安全传输

    1 课程简介 本课程将配置AS2相关的安全传输配置,学员可以通过本课程熟悉相关的安全配置. 2 准备工作 为了模拟实际的B2B交互过程,本实验需要2台BizTalk Server 2010虚拟机(两两 ...