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

31

copyretainNSString 中有什么不同?

- (void)setString:(NSString*)newString
{
    string = [newString copy];
}
9个回答

47

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

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

特别是当处理NSString时,你可能不能假设谁给你一个NSString就真的给你一个NSString。有人可能会把一个子类(在这种情况下是NSMutableString)交给你,这意味着他们可能会在背后修改值。如果你的应用程序依赖于传递的值,并且有人对它进行更改,你可能会遇到问题。


16
йЬАи¶БзњїиѓСзЪДеЖЕеЃєпЉЪIt should be mentioned that copy is equivalent to retain for most of the Foundation classes that aren't mutable.зњїиѓСзїУжЮЬпЉЪйЬАи¶БжПРеИ∞зЪДжШѓпЉМеѓєдЇОе§Іе§ЪжХ∞дЄНеПѓеПШзЪДFoundationз±їпЉМcopy еТМ retain жШѓз≠ЙдїЈзЪДгАВ - rpetrich
3
我可以建议您使用“你与传递给你的人分享那个实例”比“你与传递给你的人分享那个副本”更清晰明了吗?(因为我们已经在谈论复制) - user577537

24

保留和复制是两个不同的概念,前者在概念上是按引用传递,而后者则是按值传递。


12

retain:该操作针对已创建的对象,只是增加其引用计数。

copy:它会创建一个新的对象,并且新对象的引用计数为1。

希望这有所帮助...:)


7

这是一篇老文章,但以下是我的看法:

retain会将对象的保留计数增加1并拥有该对象。

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

请记住,retain适用于引用,而copy适用于值。


保留不复制引用。 - Lorenzo B
copy 会创建新的对象吗? - Dhiru

5

如果你使用retain,它会复制原始指针的值。retain也会将引用计数增加一。 但是在复制的情况下,它会复制指针所引用的数据,并将其分配给副本的实例变量。


3
最大的区别在于,如果您使用copy,则要复制的对象必须实现NSCopying协议(非常容易做到)。并非每个对象都实现了该协议,因此在尝试调用copy时,您需要小心确保知道要操作的类型(或检查该协议的支持)。
我能想到的最好的copy使用法则是,始终将NSString属性设置为"copy"而不是retain。这样,如果您搞砸了并忘记释放一个字符串对象所持有的内容,您可以从Leaks工具中获得更准确的读数。其他使用copy的情况需要更加仔细地考虑。

2

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


1

copy: 创建一个接收器的副本实例。这意味着你将会有两个不同的实例。

retain: 增加接收器的retainCount。当retainCount为0时,对象将从内存中移除(使用dealloc方法)。


1
我认为你的意思是“dealloc'ed”(将该单词转化为动词有点别扭),而不是“deadlocked”。 - Brian

0

如果指定了保留属性,它可以保留另一个内存地址,也可以指向另一个地址。复制操作首先复制地址,然后将其保留。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接