昨天突然被提及到了一个问题: Block 的作为属性,应该是 copy
还是 strong
?(当然,原问题不是这个,出于某些原因吧。)
很多人第一反应都是 copy
但是,我似乎在苹果的Tips上看到过,似乎 strong
也可以,所以只描述了一下堆栈拷贝流程,没敢确切的回答,回来翻了一下文档,果然,在 ARC 下都是可以的。
ARC 下,之所以 Block
还使用 copy
是从 MRC 遗留下来的,在 MRC 中,方法内部的 Block
实在栈区的,使用 copy
可以把它放到堆区。其实在 ARC 下写不写都OK。因为编译器自动对 Block
进行了 copy
操作。(Swift 中变成了 逃逸性闭包与非逃逸性闭包,可以参考我以前的文章。) 我猜也许好多人还坚持要在 ARC 下写 copy
可能是在时刻提醒自己吧。这样就会不犯二去手动拷贝属性值。
在 property
中 的 NSString, NSArray, NSDictionary
使用 copy
比较常见,因为他们有对应的 mutable
,为了确保这些不可变对象不会乱改变,所以应该在设置新属性的时候 copy
一份。