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 属性应该是强的还是复制的?的主要内容,如果未能解决你的问题,请参考以下文章
我应该在接口中声明变量还是在objective-c arc中使用属性?