【发布时间】:2011-01-24 20:43:27
【问题描述】:
copy 和retain 的NSString 有什么区别?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
【问题讨论】:
标签: objective-c nsstring copy retain
copy 和retain 的NSString 有什么区别?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
【问题讨论】:
标签: objective-c nsstring copy retain
保留和复制是两个不同的东西,第一个 在概念上是按引用调用,而第二个是按值调用。
【讨论】:
在一般情况下,保留一个对象会将其保留计数增加一。这将有助于将对象保留在内存中并防止它被吹走。这意味着,如果您只持有它的保留版本,您就可以与传递给您的任何人共享该副本。
无论你如何复制一个对象,都应该创建另一个具有重复值的对象。将此视为克隆。您不会与传递给您的任何人共享克隆。
尤其是在处理NSStrings 时,您可能无法假设给您NSString 的人是真的给您NSString。有人可能会给您一个子类(在这种情况下为NSMutableString),这意味着他们可能会修改幕后的值。如果您的应用程序依赖于传入的值,并且有人在您身上更改了它,那么您可能会遇到麻烦。
【讨论】:
Foundation 类,copy 等同于retain。
最大的不同是如果你使用copy,你要复制的对象必须实现NSCopying协议(很容易做到)。并非每个对象都实现了这一点,因此在尝试调用 copy 时,您需要小心确定您将针对哪种类型进行操作(或检查是否支持该协议)。
我能想到的使用copy 的最佳经验法则是始终将 NSString 属性设置为“复制”而不是保留。这样,如果您搞砸并忘记释放物体所握住的绳子,您就可以从泄漏仪器中获得更准确的读数。文案的其他用途需要更仔细地考虑。
【讨论】:
copy: 创建一个作为接收者副本的新实例。这意味着您将拥有 2 个不同的
retain: 增加接收者的retainCount。当 retainCount 为 0 时,从内存中删除一个对象(使用 dealloc)。
【讨论】:
如果你使用retain,它会从原始one中复制指针值。retain也会将引用计数加一。 但是在复制的情况下,它会复制指针引用的数据并将其分配给副本的实例变量。
【讨论】:
retain :在创建的对象上完成,只是增加了引用计数。
copy -- 它创建一个新对象,当创建新对象时,retain count 将为 1。
希望对你有帮助...:)
【讨论】:
retain 属性被指定以便它可以保留另一个内存,即它也可以指向另一个地址 复制 首先复制地址,然后保留它。
【讨论】:
这是一个旧帖子,但这是我对这个问题的看法
Retain 将对象的保留计数增加 1 并取得对象的所有权。
而 copy 将复制内存位置中存在的数据并将其分配给变量,因此在复制的情况下,您首先从一个位置复制数据,将其分配给增加保留计数的变量。
请记住,保留作品的参考和复制作品的价值
【讨论】:
copy 是否创建新对象? ,
保留一个对象意味着保留计数增加一。这意味着对象的实例将保留在内存中,直到它的保留计数降至零。该属性将存储对此实例的引用,并将与保留它的任何其他人共享同一个实例。复制意味着将使用重复值克隆对象。它不与任何其他人共享。
【讨论】: