ARC 下的 NSString 属性应该是强的还是复制的?

Posted

技术标签:

【中文标题】ARC 下的 NSString 属性应该是强的还是复制的?【英文标题】:Should an NSString property under ARC be strong or copy? 【发布时间】:2012-06-30 06:27:33 【问题描述】:

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

【问题讨论】:

你想做什么?显示一段示例代码,您想知道要遵循的正确方法。 【参考方案1】:

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

【讨论】:

请注意,当我说“保证”时,我指的是符合 Objective-C 最佳实践的代码。我无法解释一个流氓程序员认为将copy 方法添加到NSString 类别是明智的。 NSMutableArray 我应该使用副本吗? 如果你有一个NSMutableArray 想要在你的班级之外进行修改,那么不,否则返回一个mutableCopy 他们可以独立于你的班级进行修改。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您使用的是 ARC 还是 非 ARC 并不重要。

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

我无法访问第一个链接,有人可以引用链接中的确切帖子吗?

以上是关于ARC 下的 NSString 属性应该是强的还是复制的?的主要内容,如果未能解决你的问题,请参考以下文章

ARC 的@property 定义:强还是保留?

我应该在接口中声明变量还是在objective-c arc中使用属性?

weak属性需要在dealloc中置nil么?

使用 ARC 的 Objective-C 代表

是否允许使用 ARC 在 ObjC 中调用 [obj copy]?

NSString 到 CFStringRef 和 CFStringRef 到 ARC 中的 NSString?