我了解通常您对 NSStrings 使用副本,以便您的属性保持与分配时相同的值,即使尝试在其他地方重新设置它也是如此。
但我很难完全理解这个概念。这是否适用于基本上任何类型的对象(不仅仅是 NSStrings)?
所以我的问题是,“我应该将什么样的属性设置为‘复制’,为什么?”
我了解通常您对 NSStrings 使用副本,以便您的属性保持与分配时相同的值,即使尝试在其他地方重新设置它也是如此。
但我很难完全理解这个概念。这是否适用于基本上任何类型的对象(不仅仅是 NSStrings)?
所以我的问题是,“我应该将什么样的属性设置为‘复制’,为什么?”
像字符串这样的简单数据位对象,不会引用应用程序中的大量其他对象,非常适合复制。
当然,现在您可以保留字符串之类的东西。这将正常工作。但是,如果你有一个可变字符串,并且你修改了它会怎样。现在,引用该字符串的所有其他对象都将看到该修改。这可能不是你想要的。这是复制“更简单”的原因之一,因为对该数据的任何更改都本地化为那段代码。
另一方面,假设您有一个为您的应用程序编写的类的实例。它在你的应用程序中引用了其他对象,它有大量自己的字符串或其他值,它是一个复杂的野兽。现在复制这个对象可能不是一个好主意。很有可能,如果您修改此对象,那么您希望将更改传播到每个拥有引用的对象。即使你确实复制了它,你需要一个浅拷贝(一个新实例,但它的 ivars 引用相同的对象)还是一个深拷贝(一个包含每个 ivar 的新副本的新实例)?并且有问题的对象甚至可能不支持<NSCopying>
,这意味着它在技术上根本无法复制。
所以总结一下:
copy
:对象是小的、原子的数据,没有对其他对象的任何内部引用。retain
: 几乎所有其他类型的物体。客户端代码可以将 NSMutableString 对象分配给 NSString 属性。如果该属性被定义为 strong 或其他一些非复制属性,那么如果客户端稍后更改可变字符串,则该属性的值现在将不同。通过将属性设置为“复制”,会生成字符串值的副本,这样可以确保值不会在您背后更改。
因此,基本上,只要属性用于具有可变对应物的类型并且您希望确保该值不会在您身上发生变化,您就应该使用 copy。