2009-03-28 3 views
1

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

ответ

0

сделал вам копия или сохраняют NSString?

2

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

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

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

+0

Ах, вы, казалось, бил меня к удару. Во всяком случае, вы, вероятно, хотите «остановить его« освобождение-освобождение », а свойства не сохраняются/освобождаются, если вы не используете self.property = foo вместо свойства = foo; Может быть, хорошо добавить это различие. – lhunath

4

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

Например:

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

Это создаст NSString*, который получил autorelease на. Когда вы назначаете его ivar, пул авторезистов скоро поп положит счет возврата обратно на 0 и dealloc, пока вы все еще имеете ссылку на него!

Naughty.

Вместо либо сохранить его или использовать:

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

Это возвращает владеющую ссылку. Запомнить [myString release]; в dealloc.

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

2

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

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

0

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

[myString retain]; 

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

[myString release]; 
Смежные вопросы