copy
和 retain
在 NSString
中有什么不同?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
copy
和 retain
在 NSString
中有什么不同?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
在一般情况下,保留一个对象将使其保留计数增加一。这有助于将对象保留在内存中,防止被清除。这意味着如果你只持有一个保留的版本,你会与传递给你的人共享该副本。
无论如何复制一个对象,都应该创建另一个具有重复值的对象。将其视为克隆。你不与传递给你的人共享克隆体。
特别是当处理NSString
时,你可能不能假设谁给你一个NSString
就真的给你一个NSString
。有人可能会把一个子类(在这种情况下是NSMutableString
)交给你,这意味着他们可能会在背后修改值。如果你的应用程序依赖于传递的值,并且有人对它进行更改,你可能会遇到问题。
保留和复制是两个不同的概念,前者在概念上是按引用传递,而后者则是按值传递。
retain:该操作针对已创建的对象,只是增加其引用计数。
copy:它会创建一个新的对象,并且新对象的引用计数为1。
希望这有所帮助...:)
这是一篇老文章,但以下是我的看法:
retain会将对象的保留计数增加1并拥有该对象。
而copy会复制内存中存在的数据,并将其分配给变量,因此在copy的情况下,你首先需要从一个位置复制数据并将其分配给变量,这会增加保留计数。
请记住,retain适用于引用,而copy适用于值。
copy
会创建新的对象吗? - Dhiru如果你使用retain,它会复制原始指针的值。retain也会将引用计数增加一。 但是在复制的情况下,它会复制指针所引用的数据,并将其分配给副本的实例变量。
copy
,则要复制的对象必须实现NSCopying
协议(非常容易做到)。并非每个对象都实现了该协议,因此在尝试调用copy
时,您需要小心确保知道要操作的类型(或检查该协议的支持)。copy
使用法则是,始终将NSString属性设置为"copy"而不是retain。这样,如果您搞砸了并忘记释放一个字符串对象所持有的内容,您可以从Leaks工具中获得更准确的读数。其他使用copy
的情况需要更加仔细地考虑。保留一个对象意味着保留计数增加1。这意味着对象的实例将被保存在内存中,直到它的保留计数降至零。属性将存储对此实例的引用,并与任何其他保留该实例的人共享同一实例。复制意味着对象将被克隆为重复值。它不与任何其他人共享。
copy: 创建一个接收器的副本实例。这意味着你将会有两个不同的实例。
retain: 增加接收器的retainCount
。当retainCount
为0时,对象将从内存中移除(使用dealloc方法)。
如果指定了保留属性,它可以保留另一个内存地址,也可以指向另一个地址。复制操作首先复制地址,然后将其保留。
copy
is equivalent toretain
for most of theFoundation
classes that aren't mutable.зњїиѓСзїУжЮЬпЉЪйЬАи¶БжПРеИ∞зЪДжШѓпЉМеѓєдЇОе§Іе§ЪжХ∞дЄНеПѓеПШзЪДFoundation
з±їпЉМcopy
еТМretain
жШѓз≠ЙдїЈзЪДгАВ - rpetrich