Почему я не могу выпустить этот NSString? - PullRequest
0 голосов
/ 15 января 2011

Вот соответствующий код:

NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]];
address = [address stringByAppendingFormat:@"%@", [defaultServer login]];
address = [address stringByAppendingFormat:@"?%@", [params urlEncodedString]];

NSString *response = [[NSString alloc] init];
response = [self getResponseFromWebAddress:address];

[response release];
[address release];

Этот код здесь не является ошибкой, но позже в некоторых библиотеках Apple он выдает ошибку «сообщение отправлено освобожденному экземпляру». Однако, если я закомментирую строку [address release], она будет работать нормально. Зачем? Я не совсем понимаю управление памятью, и это меня смущает.

Ответы [ 2 ]

6 голосов
/ 15 января 2011

Эта строка:

NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]];

И все следующие строки работают с автоматически выпущенными NSString s, предоставленными методами stringWithFormat: и stringByAppendingFormat:.Вы не должны выпускать address вручную, так как пул авто-выпусков будет обрабатывать это для вас.

А здесь:

NSString *response = [[NSString alloc] init];
response = [self getResponseFromWebAddress:address];

Вы выделяете новый NSString, затемнемедленно указав переменную response на другую строку, которая автоматически освобождается ([self getResponseFromWebAddress:address]).Выделенный объект больше не имеет доступных указателей, поэтому вы больше не можете его освободить, и поэтому он протекает.

Чтобы исправить обе проблемы, удалите строку alloc-init и строки release.Ваша строка address также может быть инициализирована одним оператором:

// Combine all three arguments into one format string
NSString *address = [NSString stringWithFormat:@"%@%@?%@", 
                        [defaultServer root], 
                        [defaultServer login], 
                        [params urlEncodedString]];

NSString *response = [self getResponseFromWebAddress:address];

// No need to release either variable
2 голосов
/ 15 января 2011

Запомните правило NARC (новое, выделение, сохранение, копирование). Вы должны освободить объект, только если он был создан одним из этих сообщений. В противном случае объект будет автоматически освобожден.

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