Иногда NSString становится недействительным? - PullRequest
1 голос
/ 28 марта 2009

В моем собственном приложении для iPhone я использовал несколько переменных nsstring для хранения значений. Но иногда его значение становится недействительным! Кто-нибудь знает, в чем может быть причина? Или расскажите мне о ситуации, когда переменная nsstring становится недействительной?

Ответы [ 5 ]

4 голосов
/ 28 марта 2009

NSString s также являются объектами. Они идут по тем же правилам управления памятью. Если вы грешите против этих правил, вы получите указатель на недопустимую память, и он будет выглядеть как «недействительные» данные.

Например:

myString = [NSString stringWithString:@"foo"];

Это создаст NSString* с включенным авто-выпуском. Когда вы присваиваете его ивару, этот пул автоматического выпуска скоро выскочит, установив счет сохранения в 0 и dealloc, пока у вас еще есть ссылка на него!

порочная.

Вместо этого либо сохраните его, либо используйте:

myString = [[NSString alloc] initWithString:@""];

Возвращает ссылку на владельца. Не забудьте [myString release]; в dealloc.

Это всего лишь один пример / случай плохого управления памятью. Прочитайте документы о том, как правильно управлять жизненным циклом вашего объекта. Действительно.

2 голосов
/ 29 марта 2009

Если это устройство с довольно ограниченными ресурсами, например iPhone, вам следует использовать [[NSString alloc] init*] вместо статических удобных методов, так как вы будете меньше загружать пул авто-релизов и уменьшите использование памяти. Пул очищается при каждом цикле сообщений, поэтому чем меньше объектов для перечисления, тем лучше.

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

2 голосов
/ 28 марта 2009

Они выпускаются автоматически. Если вы создаете строку с помощью вспомогательного метода (stringWithString, stringWithFormat), она будет добавлена ​​в пул автоматического выпуска.

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

Есть много статей об управлении памятью iPhone (и Mac) здесь, на SO и на межсетевых страницах. Google для автоматического выпуска.

0 голосов
/ 22 августа 2011

Я задал тот же вопрос. И следующий ответ был лучшим из удобства. Просто используйте:

[myString retain];

А затем в методе dealloc (например, viewDidUnload):

[myString release];
0 голосов
/ 28 марта 2009

Вы скопировали или сохранили строку NSS?

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