Правильное повторное использование NSMutableString на iPhone - PullRequest
0 голосов
/ 21 июня 2010

При использовании объектива-c на iPhone, что не так с этим кодом? Это утечка памяти? Зачем? Как бы я сделал это правильно?

NSMutableString *result = [NSMutableString stringWithFormat:@"the value is %d", i];

... потом в моем коде ... Возможно, мне придется изменить это на:

result = [NSMutableString stringWithFormat:@"the value is now %d", i];

Мне нужно использовать stringWithFormat во второй раз ... но разве это не создает НОВУЮ строку и неправильно освобождает старую?

Ответы [ 4 ]

5 голосов
/ 21 июня 2010

Нет, он не пропускает память, потому что stringWithFormat: возвращает автоматически освобожденный объект.

2 голосов
/ 21 июня 2010

Вы можете использовать метод экземпляра "setString" для уже существующей NSMutableString, например:

[ result setString:[NSString stringWithFormat:@"the value is now %d", i] ];
0 голосов
/ 21 июня 2010

То, что у вас есть, кажется мне естественным способом замены изменяемой строки новым содержимым, , если у вас нет других ссылок на эту изменяемую строку в другом месте.

Если у вас нет других ссылок на него, и вы повторно используете строку только для улучшения производительности / занимаемой памяти, это звучит как преждевременная оптимизация.

Кстати, вам не принадлежит строка, которую вы получаете через stringWithFormat: поэтому вам не нужно (на самом деле, не нужно) ее освобождать.

0 голосов
/ 21 июня 2010

Если вы действительно хотите повторно использовать строку, вы можете использовать что-то вроде

[result setString:@""];
[result appendFormat:@"the value is now %d", i];

Однако, если вы не заметили проблемы с производительностью / памятью, просто используйте

NSString *result = [NSString stringWithFormat:@"the value is %d", i];

/* ... */

result = [NSString stringWithFormat:@"the value is now %d", i];

Как правило, работать с неизменяемыми объектами проще, потому что они не могут измениться у вас под ногами.

...