如果我有這樣的代碼如何在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',例如Objective-C中的編程)的'速記'方法(頂部),但是蘋果文檔說這是錯誤的。
「一般的經驗法則,如果你正在調用助手靜態方法(如stringByAppendingString),那麼你不應該釋放它。」那就是我一直在尋找的東西!然而,在第一個例子中,如果儀器指示存在內存泄漏(這全部在一個簡單的方法內),我將如何釋放*請求。這似乎表明autorelease不適用於*請求。 – Gazzer 2010-01-05 09:08:46
在第一個示例中,您自己分配並初始化了請求,因此您應該釋放它。你做什麼事會導致崩潰? EXC_BAD_ACCESS?這通常意味着你已經(或者你提出了請求)已經發布了請求,但你沒有意識到。 – 2010-01-05 17:28:19