Зачем копировать строку NSSt вместо того, чтобы просто сохранить ее? - PullRequest
1 голос
/ 13 ноября 2011

сейчас я всегда делал одно и то же:

 NSString *ran = @"check";

Теперь, когда я хотел скопировать nsstring1 в nsstring2, мне сказали, что мне нужно копировать / сохранять экземпляр nsstring различными способами (со свойством retain / copy) ..

NSString *animation = [ran copy];

Я знаю и понимаю, как это сделать, но не могу понять, почему.

что именно здесь происходит с памятью? я просто не мог понять, что происходит, когда я делаю копию / сохраняю, и когда я должен это делать? (в вышеупомянутом первом экзамене также ??)

все объяснения здесь касаются разницы между копированием / сохранением, но я не смог найти ничего о ПРИЧИНЕ, мне нужно скопировать экземпляр класса.

1 Ответ

5 голосов
/ 13 ноября 2011

Вы бы скопировали строку, если вам нужно, чтобы она была неизменной, и вы не знаете, является ли она неизменной. Скажем, у вас есть этот метод:

- (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 не будет затронут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...