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

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

【问题讨论】:

  • 你想做什么?显示一段示例代码,您想知道要遵循的正确方法。

标签: objective-c cocoa-touch automatic-ref-counting declared-property


【解决方案1】:

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

【讨论】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 我无法访问第一个链接,有人可以引用链接中的确切帖子吗?
      猜你喜欢
      • 2014-08-06
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2012-05-06
      相关资源
      最近更新 更多