何时在objective-c中使用setter属性'copy'?

时间:2012-10-13 22:37:58

标签: objective-c ios ios5 setter

我了解通常您使用复制作为NSStrings,以便您的属性保持与分配时相同的值,即使尝试将其重新设置到其他位置也是如此。

但我很难完全理解这个概念。这不适用于任何类型的对象(不仅仅是NSStrings)吗?

所以我的问题是,“我应该将哪种属性设置为'复制',为什么?”

2 个答案:

答案 0 :(得分:17)

简单的数据对象(如字符串)不会引用应用程序中的大量其他对象,这些对象非常适合复制。

现在你可以保留像字符串这样的东西。这样可以正常工作。但是,如果你有一个可变的字符串,然后你修改了它。现在,每个引用该字符串的其他对象都会看到该修改。这可能不是你想要的。这是复制“更简单”的一个原因,因为对该数据的任何更改都只是局限于该位代码。

另一方面,假设您有一个为您的应用编写的类的实例。它引用了你应用中的其他对象,它有很多自己的字符串或其他值,它是一个复杂的野兽。现在复制这个对象可能不是一个好主意。如果您修改此对象,那么您可能想要更改以传播到包含引用的每个对象。即使你复制了它,你需要一个浅拷贝(一个新的实例,但它的ivars引用相同的对象)或一个深拷贝(一个包含每个ivar的新副本的新实例)?并且有问题的对象可能甚至不支持<NSCopying>,这意味着它在技术上根本无法复制。


总结一下:

  • copy:对象是小型的原子数据,没有对其他对象的任何内部引用。
  • retain:几乎所有其他类型的对象。

答案 1 :(得分:7)

客户端代码可以将NSMutableString对象分配给NSString属性。如果属性被定义为strong或其他非复制属性,那么如果客户端稍后更改了可变字符串,则属性的值现在将不同。通过将属性设置为“复制”,可以创建字符串值的副本,这可以确保值不会在您的背后发生变化。

所以基本上你应该使用copy,只要属性是一个具有可变对应类型的类型,并且你想确保值不会改变你。