编译器会自动将块属性复制到堆吗?

时间:2016-05-26 09:55:05

标签: objective-c

编译器是否会自动将块属性复制到堆中,无论它是在“强”还是“复制”属性下?

正如有人说这是规则,但他们不知道为什么,我想知道更多细节。

1 个答案:

答案 0 :(得分:1)

在Apple的Working with Blocks最新版本2014年9月,他们表示块值属性应该使用copy,但随后会立即清理(强调添加) :

  

注意:您应该将copy指定为属性属性,因为需要复制块以跟踪其在原始范围之外的捕获状态。 这不是您在使用自动引用计数时需要担心的事情,因为它会自动发生,但属性属性的最佳做法是显示结果行为。

所以问题的答案是:

  

编译器是否会自动将块属性复制到堆中,无论它是在“强”还是“复制”属性下?

是的,所以只要你使用ARC - 这些都是标准的。

关于可辩解的“最佳实践”:块是不可变对象,通常不会复制。只需要copy,因为Apple最初选择使块上块优化既可见又部分受程序员支持 - 这是编译器优化的一个不寻常的选择。但是对于ARC用户来说,那些日子早已过去,但是MRC用户仍然必须手动管理此优化。

HTH