编译器是否会自动将块属性复制到堆中,无论它是在“强”还是“复制”属性下?
正如有人说这是规则,但他们不知道为什么,我想知道更多细节。
答案 0 :(得分:1)
在Apple的Working with Blocks最新版本2014年9月,他们表示块值属性应该使用copy
,但随后会立即清理(强调添加) :
注意:您应该将copy指定为属性属性,因为需要复制块以跟踪其在原始范围之外的捕获状态。 这不是您在使用自动引用计数时需要担心的事情,因为它会自动发生,但属性属性的最佳做法是显示结果行为。
所以问题的答案是:
编译器是否会自动将块属性复制到堆中,无论它是在“强”还是“复制”属性下?
是的,所以只要你使用ARC - 这些都是标准的。
关于可辩解的“最佳实践”:块是不可变对象,通常不会复制。只需要copy
,因为Apple最初选择使块上块优化既可见又部分受程序员支持 - 这是编译器优化的一个不寻常的选择。但是对于ARC用户来说,那些日子早已过去,但是MRC用户仍然必须手动管理此优化。
HTH