为什么要使用copy for block属性?

时间:2014-02-19 17:38:27

标签: objective-c cocoa objective-c-blocks

为什么要将bloc属性声明为copy?

typedef void(^Thunk)(void);
@property (nonatomic, copy) Thunk block;

为什么需要复制块对象?

3 个答案:

答案 0 :(得分:3)

因为在文件堆栈上创建了块文字,并且在函数退出时将被销毁。当保持一个块时,有必要复制它。

答案 1 :(得分:2)

如果您要在定义范围之外使用块,则需要复制它,因为它会将其复制到堆中。原始块在堆栈上分配,因此当它超出范围时将被解除分配,即在完成定义的方法或代码块时。大多数情况下,块用于异步活动,因此通常需要执行此操作。

答案 2 :(得分:1)

在堆栈上创建一个块,并将状态捕获到堆栈分配。您需要执行以下复制:

  • 复制块
  • 复制其捕获的状态
  • 并形成对objc_objects
  • 的强引用

...这样你就可以安全地使用它在其中创建的词法范围之外的块。