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