Поведение объекта при выпуске в iPhone - PullRequest
0 голосов
/ 26 ноября 2010

Если я освобождаю mainPath в следующем примере, программа выдает ошибку (потому что я освобождаю объект с нулевым счетчиком)

NSString  *mainPath = [NSString stringWithFormat:@"%@/Documents/downloadFile.plist",NSHomeDirectory()];
NSLog(@"address is = %@",mainPath);
[mainPath release]; //Program failed here

Но следующий код работает нормально.

NSString *aa=@"hiiiii";
[aa release];

Может кто-нибудь объяснить это?

На самом деле мне не совсем понятна концепция указателя (дайте подходящую ссылку, чтобы очистить его)

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

Постоянные строки NSS являются особым случаем.Они размещаются статически во время компиляции и не могут быть освобождены.Вы можете отправлять релиз в константную строку столько раз, сколько захотите, и он никогда не будет освобожден.Это достигается в текущей реализации путем установки счетчика сохранения в INT_MAX, который рассматривается как специальное значение, означающее «не уменьшать меня при выпуске».

3 голосов
/ 26 ноября 2010

Вам следует прочитать Руководство по управлению памятью какао или хотя бы Objective-C Tutorial Скотта Стивенсона. (Действительно. Сделайте это, вы сэкономите много времени в долгосрочной перспективе.) Разница в том, что первая строка автоматически высвобождается, вы не являетесь ее владельцем и не должны ее выпускать. Вторая строка особенная, я думаю, что она вообще не размещена в куче, и release здесь по сути неактивен.

2 голосов
/ 26 ноября 2010

String with format - это удобный метод, который автоматически высвобождает строку, поэтому в этом случае вы, скорее всего, будете отправлять сообщение об освобождении уже освобожденному объекту.

Во втором примере вы создаете строку статическипоэтому сохранение отсчетов не применяется.

0 голосов
/ 26 ноября 2010

Вам не нужно освобождать свои объекты ни в одном из этих случаев.

Как правило, если вы не использовали init (или initWithFoo:) для создания объекта и не использовали преднамеренно retain для сохранения объекта (плюс пара других более редких случаев) , вам не нужно использовать release.

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