61

不使用 ARC 编译时,建议使用copy数据类型的属性,例如NSString. 我找不到关于copy在 ARC 模式下使用的正确文档。有人能告诉我什么适用于 ARC 吗?

4

4 回答 4

81

仍然建议复制,因为您想避免传递可变字符串然后在您不知情的情况下更改它。副本保证您拥有的字符串不会更改。

于 2012-06-28T17:16:14.210 回答
14

复制和 ARC 是正交的:复制可变对象以“冻结”它们的状态;ARC 跟踪对象的引用计数。

NSString对象可能是可变的,也可能不是可变的。当您收到一个NSString*作为参数时,除非您检查它的类型,否则您无法确定它是不可变的(即使这样您也可能会得到误报)。如果您的算法依赖于设置后不更改的字符串,那么制作副本是正确的做法。另一方面,ARC 将确保在您持有对它的强引用时不会释放该对象。

于 2012-06-28T17:16:43.443 回答
12

无论您使用的是ARC还是非 ARC都没有关系。

背后的原因copy是您可以保证您的类的内部状态不能从实现外部修改。

如果有人将 传递给您NSMutableString,然后稍后对其进行修改,则可能会发生这种情况。这种考虑与内存管理环境无关。

于 2012-06-28T17:16:19.327 回答
11

copy算作strong。利用:

@property(nonatomic,copy) NSString *name;

https://devforums.apple.com/message/654033#654033

甚至:

@property NSString *firstName;

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/DefiningClasses/DefiningClasses.html#//apple_ref/doc/uid/TP40011210-CH3-SW7

于 2013-04-10T17:18:07.513 回答