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

Vla*_*lad 7 setter objective-c ios ios5

我知道通常你使用NSStrings的副本,这样你的属性就像你分配它时一样保持相同的价值,即使试图在其他地方重新设置它.

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

所以我的问题是,"我应该将什么样的属性设置为'复制',为什么?"

Ale*_*yne 17

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

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

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


总结一下:

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


rma*_*ddy 7

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

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