2010-03-08 75 views

回答

45

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

复制一个对象,但是你这样做,应该创建另一个对象重复的值。把它想象成一个克隆。你不会与任何传递给你的人分享克隆。

NSString S IN特别处理,你可能不能够假设不管是谁给你一个NSString是真正给你一个NSString。有人可能会把一个子类(NSMutableString,在这种情况下),这意味着他们可能会修改覆盖下的值。如果您的应用程序依赖于传入的值,并且有人对您进行了更改,则可能会遇到麻烦。

+15

复制作品应该提到的是'copy'等同于'retain'对于大多数非可变的'Foundation'类。 – rpetrich 2010-03-08 08:44:37

+0

非常丰富的.. – Krishnan 2011-05-20 08:29:13

+3

我可以建议“你**分享** *实例*与任何人传递给你”比“你**分享** *复制*与任何人传递给你更清晰” ? (看到我们正在谈论复制已经) – 2012-05-02 11:15:36

23

护和复制是两个不同的事情,第一 是概念性地调用 - 参考,而第二种是调用 - 值。

3

最大的区别是,如果您使用copy,则要复制的对象必须实现NSCopying协议(非常容易)。并不是每个对象都实现了这个功能,因此当您尝试拨打copy时,您需要确保使用您所知道的关怀确定您将使用哪种类型(或者检查是否支持该协议)。

使用copy的最佳经验法则我能想到的是,总是将NSString属性设置为“复制”而不是保留。这样你就可以从Leaks仪器获得更准确的读数,如果你搞砸了,忘记释放一个对象所持有的字符串。复制的其他用途需要更仔细地考虑。

1

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

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

+1

我认为你的意思是“dealloc'ed”(有点尴尬地说出这个词),而不是“死锁” – Brian 2010-07-02 16:24:52

5

如果使用retain,它会从原始的one复制指针值。还会将引用计数加1。但在复制的情况下,它复制指针引用的数据并将其分配给副本的实例变量。

7

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

副本 - 它创建了一个新的对象,并在创建新的对象保留计数为1

希望这帮助ü... :)

0

保留属性,特别规定它可以保留我的另一个记忆。e可以使其指向另一个地址 副本首先复制地址,然后保留它。

6

一个老的文章,但这里是我的问题

视图保留增加1对象的保留计数,并采取了对象的所有权。

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

只要记住,保留对参考书和值

+0

保留不复制参考。 – 2015-02-16 10:11:21

+0

'copy'是否创建新对象? , – Dhiru 2018-01-16 10:20:19