到现在为止,我总是这样做:
NSString *ran = @"check";
现在当我想将nsstring1复制到nsstring2时,我在这里被告知我必须以各种方法复制/保留nsstring实例(使用属性retain / copy)..
NSString *animation = [ran copy];
我知道并理解如何做到这一点,但无法理解为什么。
这里的内存究竟发生了什么?我无法理解当我复制/保留东西时会发生什么,我应该什么时候这样做? (在上面的第一个例子中也是??)
这里的所有解释都是关于复制/保留之间的区别,但我找不到有关REASON的任何内容,我必须复制一个类实例。
答案 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
将不会受到影响。