Вы бы скопировали строку, если вам нужно, чтобы она была неизменной, и вы не знаете, является ли она неизменной. Скажем, у вас есть этот метод:
- (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
не будет затронут.