应当使用:@property (nonatomic, copy)

今天在这个问题上犯错误了,找了好久才知道原因。

另外,简单的进行反汇编看了下,Block 被存储在静态变量区,运行时构造出一个运行栈,进行调用。

retain 并不会改变 Block 的引用计数,因此对 Block 应用 retain 相当于 assign。

但是既然在静态存储区,为什么会出现 EXC_BAD_ACCESS 呢?代码都在的呀。

网上都说 Block 在栈上,这应该是错误的:指向 Block 代码的指针在栈上。

我感觉原因是这样:

执行静态区的代码,需要特殊的构造,比如:加载到寄存器,调整好 ESP 等。

而堆上的代码可以直接执行。

期待更详细的解释。

When storing blocks in properties, arrays or other data structures, there’s an important difference between using copy or retain. And in short, you should always use copy.

When blocks are first created, they are allocated on the stack. If the block is called when that stack frame has disappeared, it can have disastrous consequences, usually a EXC_BAD_ACCESS or something plain weird.

If you retain a stack allocated block (as they all start out being), nothing happens. It continues to be stack allocated and will crash your app when called. However, if you copy a stack allocated block, it will copy it to the heap, retaining references to local and instance variables used in the block, and calling it will behave as expected. However, if you copy a heap allocated block, it doesn’t copy it again, it just retains it.

So you should always declare your blocks as properties like this:

@property (copy, ...) (int)(^aBlock)();

And never like this:

@property (retain, ...) (int)(^aBlock)();

And when providing blocks to NSMutableArrays and the like, always copy, never retain.

转载于:https://www.cnblogs.com/Proteas/archive/2012/06/26/2563747.html

在 Objective-C 中对 Block 应用 property 时的注意事项相关推荐

  1. 在虚拟机中安装TIA博途时的注意事项

    在虚拟机中安装TIA博途时的注意事项 项目储存在共享的设备上 如果将项目储存在共享设备上,在某些情况下可能会导致项目没有写权限.打开项目后,会收到如下消息:"打开项目(0800:000014 ...

  2. 如何在Objective C中声明Block?

    本文翻译自http://fuckingblocksyntax.com/ 作为局部变量: returnType(^blockName)(parameterTypes) = ^returnType(par ...

  3. C++中getline()和cin()同时使用时的注意事项

    一:问题 当用cin输入完后 然后再用getline()的话就会直接结束没办法在输入了 问题分析: cin只是在缓存区中,把字符读走,会剩余/n在缓存区中,但是getline对/n极度敏感,导致get ...

  4. Python中正则匹配使用findall时的注意事项

    在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串  "123@qq.comaaa@163.combbb@126.comasdf111@a ...

  5. Objective-C中的Block

    1.Block定义 可以用一句话来表示Block:带有自动变量(局部变量)的匿名函数. 在iOS中使用"^"来声明一个Block.Block的内容是包含在"{}" ...

  6. OC中的Block属性

    Block是苹果极力推荐使用的一个知识点,它的简单实用使其在最近几年变的特别流行,尤其是在不同类之间传值的时候,比通过代理实现要方便得多.OC中的block可以借助C中的函数指针来理解,原理基本类似, ...

  7. 如何在 iOS 5 中使用 Block

    How To Use Blocks in iOS 5 Tutorial – Part 1 How To Use Blocks in iOS 5 Tutorial – Part 2 本人将示范项目放在了 ...

  8. 解决MyBatis中 Could not set property ~ o f ~异常

    解决MyBatis中 Could not set property ~ of ~ public class Role {private Integer id; //idprivate String r ...

  9. Spark 中 File,Block,Split,Task,Partition,RDD概念的理解

    1,在 HDFS 中会以 Block 为单位进行存储很多的 File,也就是说每个 File 可能会被拆分成多个 Block 存储在 HDFS 上: 2,当 Spark 读取 HDFS 上的文件作为输 ...

最新文章

  1. win10用什么软件测试硬件,Win10系统下硬件设备检测工具的使用方法
  2. android代码里 写线程,在Android线程池里运行代码任务实例
  3. 【SDCC 2016·杭州站】9月22日大数据实战专场精彩呈现
  4. html文本超出自动换行、显示省略号
  5. 适用于android 4.0以上版本的子线程网络图片查看器
  6. 学好 Web 前端的 6 点建议
  7. FCPX插件:Hyper Zoom Transitions Mac(33种扭曲变形缩放转场效果)
  8. Hinton发布最新论文!表达神经网络中部分-整体层次结构
  9. quartz定时程序无故停止并且没有错误
  10. cmake编译多个文件夹_cmake多目录构建(二)
  11. POJ 2411.Mondriaan's Dream 解题报告
  12. 时间插件只能选择整点和半点_外贸人如何把控合适的客户开发时间及跟进频率...
  13. Java编程思想基本介绍
  14. 最新支持android的手机型号,Andorid10支持手机型号有哪些 安卓10适配机型介绍
  15. spark学习7之IDEA下搭建Spark本地编译环境并上传到集群运行
  16. jspstudy oracle,tomcat出错,大神们来看看呐
  17. 记账系统推荐金蝶精斗云_金蝶精斗云是免费会计记账软件吗?
  18. 万能的5款工具推进活动策划方案
  19. 【算法】递归|迷宫回溯问题|八皇后问题
  20. 循环函数:while循环和for循环及函数定义

热门文章

  1. mysql dnslog_dnslog小技巧
  2. grub shell 错误_各种情况GRUB损坏进不了系统的解决方案
  3. 如何拉取k8s镜像_K8s 从懵圈到熟练 – 镜像拉取这件小事
  4. 基于Java+SpringBoot+vue+element实现家具购物销售网站详细设计和实现
  5. mysql sql高级应用程序_mysql-sql高级应用
  6. activemq使用linux内核机制,activemq基础之:(四)CentOS7 Linux搭建activemq
  7. python登录网页账号密码_遇到需要登录的网站怎么办?学好python,用这3招轻松搞定...
  8. java两种异常_JAVA两种异常的区别 (转)
  9. vue create()获取ref_vue-next+typescript 初体验
  10. vc6.0mfc中单选按钮如何分组_按钮系列02-搞定按钮和选框的14个秘诀