Если у меня есть этот кодКак я могу надежно освободить память в приложении iPhone?
NSString *postData = [@"foo=" stringByAppendingString:fooText.text];
...
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
...
[postData release]; //this causes crash
[request release]; //this causes crash
Теперь я понимаю, что это expected behavior according to Apple's documents. Теперь, если я удалю код выпуска, авария не произойдет, но я обнаружил, что утечка памяти в любом случае для * запроса. Поэтому я переписал код
NSString *postData;
//postData = [NSString alloc]; // this line commented out since OP
postData = [@"foo=" stringByAppendingString:fooText.text];
...
NSMutableURLRequest *request;
request = [NSMutableURLRequest alloc];
request = [request initWithURL:url];
...
[postData release]; //this still crashes #
[request release]; //this works fine
Я действительно не понимаю, почему он потерпел крах в #. Есть ли рекомендуемая рекомендация? Я думаю, что мне что-то не хватает, потому что я часто вижу «стенографический» подход (сверху), имеющий выпуск (Kochan, Programming in Objective-C, например), но документы Apple говорят, что это неправильно.
«Общее эмпирическое правило, если вы вызываете вспомогательный статический метод (например, stringByAppendingString), вы не должны его отпускать». Это то, что я искал!Однако как бы я выпустил запрос * в первом примере, учитывая, что инструменты указывают на наличие утечки памяти (все это внутри простого метода). Это, по-видимому, указывает на то, что автореферат не работал для запроса *. – Gazzer
В первом примере вы выделили и ввели запрос самостоятельно, чтобы вы его выпустили. Какая авария вы получаете, когда делаете? EXC_BAD_ACCESS? Это обычно означает, что вы (или что-то, что вы дали запрос) уже выпустили запрос, и вы этого не понимаете. –