copy
的{{1}}和retain
之间有什么区别?
NSString
答案 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首先复制地址,然后保留它。