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

 

应当使用:@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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值