Правильное повторное использование NSMutableString на iPhone

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

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

... затем позже в моем коде... Мне может понадобиться изменить это на:

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

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


person Helen    schedule 21.06.2010    source источник


Ответы (4)


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

person Ole Begemann    schedule 21.06.2010

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

[ result setString:[NSString stringWithFormat:@"the value is now %d", i] ];
person Olli    schedule 21.06.2010
comment
Предполагая, что вы имеете в виду [NSString stringWithFormat, что полностью упускает суть: он создает новую строку, а затем копирует ее содержимое в изменяемую строку вместо простого повторного использования памяти изменяемой строки. - person tc.; 21.06.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];

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

person tc.    schedule 21.06.2010

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

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

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

person JeremyP    schedule 21.06.2010