NSString的retain和copy有什么区别?

4
我在这里看到了一些关于使用retain或copy来处理字符串的问题的帖子。但我仍然无法完全理解它们之间的区别和重要性。
目前在我的情况下,我有一个类,其中包含许多nsstrings以保存字符串。
我希望该类只被实例化一次,并且我希望它的nsstring变量根据在表视图中点击的索引而改变。
如果我选择使用retain,那么每次在表视图上点击时,我的nsstrings将被覆盖,如果我选择使用copy,那么我会得到每个字符串的两个实例吗?
很抱歉,我完全不明白。
1个回答

6

这是一个关于复制可变对象和不可变对象的问题。由于NSString对象是不可变的(您无法更改它们的内容),因此它们实现了-copy方法如下:

- (id) copyWithZone: (NSZone *) zone
{
    return [self retain];
}

如果您考虑一下,没有理由复制一个不可变的对象,因为这是浪费内存。另一方面,NSMutableString对象可以在其生命周期内看到其内容发生更改,因此如果您请求NSMutableString的副本,您将获得一个真正的副本,即不同的对象。
如果您的字符串不是NSMutableStrings,则无论您保留还是复制它们都无所谓。但是,如果以后重构代码以使用NSMutableStrings,则选择正确的方法很重要。常见的逻辑应该回答以下问题:如果我得到一个其内容可能会在外部更改的对象,我需要哪个值?往往情况下,您会想要制作一个副本。

谢谢你的澄清!我不知道[NSString copy]只会保留对象。 - MrMage

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