为什么要复制NSString而不是保留它?

时间:2011-11-13 09:17:49

标签: objective-c

到现在为止,我总是这样做:

 NSString *ran = @"check";

现在当我想将nsstring1复制到nsstring2时,我在这里被告知我必须以各种方法复制/保留nsstring实例(使用属性retain / copy)..

NSString *animation = [ran copy];

我知道并理解如何做到这一点,但无法理解为什么。

这里的内存究竟发生了什么?我无法理解当我复制/保留东西时会发生什么,我应该什么时候这样做? (在上面的第一个例子中也是??)

这里的所有解释都是关于复制/保留之间的区别,但我找不到有关REASON的任何内容,我必须复制一个类实例。

1 个答案:

答案 0 :(得分:5)

如果你需要它是不可变的,你会复制一个字符串,并且你不知道它是否是不可变的。假设您有这种方法:

- (void)setName:(NSString *)newName
{
    _name = [newName retain];
}

你希望我这样称呼你的方法:

[yourObject setName:@"Rob"];

但我可能会这样做:

NSMutableString *sneaky = [NSMutableString stringWithString:@"Rob"];
[yourObject setName:sneaky];

然后一段时间后我可能会这样做:

[sneaky appendString:@"ert"];
// sneaky is now @"Robert"

由于您的setName:方法仅保留了传递的字符串,因此我在您不知道的情况下更改了私有_name变量的值。也许你依赖它不会改变。

为了防止这种偷偷摸摸,您可以像这样编写setName:方法:

- (void)setName:(NSString *)newName
{
    _name = [newName copy];
}

现在您创建一个我传入的任何名称的不可变副本。如果我传入一个可变字符串,然后更改它,您的_name将不会受到影响。