30

copy和 和retain有什么不一样NSString

- (void)setString:(NSString*)newString
{
    string = [newString copy];
}
4

9 回答 9

46

在一般情况下,保留一个对象会将其保留计数增加一。这将有助于将对象保留在内存中并防止它被吹走。这意味着,如果您只持有它的保留版本,您将与传递给您的任何人共享该副本。

无论您如何复制一个对象,都应该创建另一个具有重复值的对象。将此视为克隆。您不会与传递给您的任何人共享克隆。

特别是在处理NSStrings 时,你可能无法假设给你 an 的人NSString是真的给你一个NSString. 有人可能会给你一个子类(NSMutableString在这种情况下是 ),这意味着他们可能会修改幕后的值。如果您的应用程序依赖于传入的值,并且有人在您身上更改了它,您可能会遇到麻烦。

于 2010-03-08T05:47:58.847 回答
24

保留和复制是两个不同的东西,第一个在概念上是按引用调用,而第二个是按值调用。

于 2010-03-08T05:42:49.040 回答
12

保留:它是在创建的对象上完成的,它只是增加了引用计数。

复制——它创建一个新对象,当创建新对象时,保留计数将为 1。

希望这对你有帮助...... :)

于 2012-09-03T09:22:51.430 回答
6

这是一个旧帖子,但这是我对这个问题的看法

Retain 将对象的保留计数增加 1 并获得对象的所有权。

而复制将复制内存位置中存在的数据并将其分配给变量,因此在复制的情况下,您首先从一个位置复制数据,将其分配给增加保留计数的变量。

请记住,保留参考作品和复制作品价值

于 2014-05-09T12:15:45.477 回答
5

如果您使用保留,它会从原始 one.retain 复制指针值。保留也会将引用计数加一。但在复制的情况下,它复制指针引用的数据并将其分配给复制的实例变量。

于 2010-07-29T04:58:51.227 回答
3

最大的不同是,如果你使用copy,你正在复制的对象必须实现NSCopying协议(很容易做到)。并非每个对象都实现了这一点,因此在尝试调用copy.

copy使用我能想到的最佳经验法则是始终将 NSString 属性设置为“复制”而不是保留。这样,如果您搞砸并忘记释放物体所握住的绳子,您就可以从 Leaks 仪器中获得更准确的读数。文案的其他用途需要更仔细地考虑。

于 2010-03-08T06:26:46.487 回答
1

复制:创建一个作为接收者副本的新实例。这意味着你将有 2 个不同的

保留:增加retainCount接收者的。当 retainCount 为 0 时,从内存中删除一个对象(使用 dealloc)。

于 2010-03-08T08:16:52.520 回答
1

保留一个对象意味着保留计数增加一。这意味着对象的实例将保留在内存中,直到它的保留计数降至零。该属性将存储对此实例的引用,并将与保留它的任何其他人共享同一个实例。复制意味着将使用重复值克隆对象。它不与任何其他人共享。

于 2018-06-10T09:16:06.440 回答
0

指定保留属性以便它可以保留另一个内存,即它可以指向另一个地址也复制首先复制地址然后保留它。

于 2013-07-17T06:42:11.450 回答