“复制”和“保留”有什么区别?

时间:2010-03-08 05:35:34

标签: objective-c nsstring copy retain

copy的{​​{1}}和retain之间有什么区别?

NSString

9 个答案:

答案 0 :(得分:46)

在一般设置中,保留对象会使其保留计数增加1。这将有助于将对象保留在内存中并防止其被吹走。这意味着,如果您只持有保留版本,则与任何人一起分享该副本。

复制对象,无论如何,都应该使用重复值创建另一个对象。将此视为克隆。你不与任何传递给你的人分享克隆。

特别是在处理NSString时,您可能无法假设任何给您NSString的人真正给您NSString。有人可能会给你一个子类(在这种情况下为NSMutableString),这意味着他们可能会修改封面下的值。如果您的应用程序依赖于传入的值,并且有人对您进行更改,则可能会遇到麻烦。

答案 1 :(得分:24)

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

答案 2 :(得分:10)

保留:在已创建的对象上完成,只会增加引用次数。

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

希望这个帮助你...:)

答案 3 :(得分:6)

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

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

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

请记住,retain适用于引用和复制适用于值

答案 4 :(得分:5)

如果使用retain,则从原始值复制指针值.retain也将引用计数增加1。 但是在复制的情况下,它复制指针引用的数据并将其分配给复制的实例变量。

答案 5 :(得分:3)

最大的区别在于,如果使用copy,则要复制的对象必须实现NSCopying协议(非常容易)。并非每个对象都实现了这一点,因此在尝试调用copy时,您需要使用您知道的关注以确定您将要操作的类型(或检查该协议的支持)。

使用copy我可以想到的最好的经验法则是始终将NSString属性设置为“复制”而不是保留。这样,如果你陷入困境并忘记释放一个物体所持有的弦,你可以从Leaks乐器获得更准确的读数。需要更仔细地考虑其他复制用途。

答案 6 :(得分:1)

copy:创建一个新实例,它是接收者的副本。这意味着你将有2个不同的

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

指定了

retain属性,使得它可以保留另一个存储器,也可以使其指向另一个地址 copy首先复制地址,然后保留它。