繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM