[英]When to use setter attribute 'copy' in objective-c?
我知道通常你会使用NSStrings的副本 ,这样你的属性就会保持与分配它时相同的值,即使试图在其他地方重新设置它。
但我很难完全理解这个概念。 这不适用于任何类型的对象(不仅仅是NSStrings)吗?
所以我的问题是, “我应该将什么样的属性设置为'复制',为什么?”
简单的数据对象(如字符串)不会引用应用程序中大量其他对象的对象非常适合复制。
当然,现在你可以保留像字符串这样的东西。 这样可以正常工作。 但是,如果你有一个可变的字符串,然后你修改了它。 现在,每个引用该字符串的其他对象都会看到该修改。 这可能不是你想要的。 这是复制“更简单”的一个原因,因为对该数据的任何更改都本地化为该位代码。
另一方面,假设您有一个为应用程序编写的类的实例。 它引用了你应用中的其他对象,它有很多自己的字符串或其他值,它是一个复杂的野兽。 现在复制这个对象可能不是一个好主意。 如果您修改此对象,则可能希望更改传播到包含引用的每个对象。 即使你复制了它,你需要一个浅拷贝(一个新的实例,但它的ivars引用相同的对象)或一个深拷贝(一个包含每个ivar的新副本的新实例)? 并且有问题的对象可能甚至不支持<NSCopying>
,这意味着它在技术上根本不能被复制。
总结一下:
copy
:对象是小的,原子位的数据,没有对其他对象的任何内部引用。 retain
:几乎所有其他类型的对象。 客户端代码可以将NSMutableString对象分配给NSString属性。 如果属性被定义为strong或其他非复制属性,那么如果客户端稍后更改了可变字符串,则属性的值现在将不同。 通过将属性设置为“复制”,可以生成字符串值的副本,这可以确保值不会在您的背后更改。
所以基本上你应该使用copy,只要属性是一个具有可变对应类型的类型,并且你想确保值不会改变你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.