2010-03-15 26 views
0

我有一個類,它基於幾個傳入的變量來構建請求。該類還具有所有的委託方法來接收數據並將其存儲在一個屬性中以供調用類檢索。叮噹發現內存泄漏,但無法釋放和autorelease崩潰

當類初始化它創建一個連接,然後返回自己:

NSURLConnection *connection; 
if (self = [super init]) { 
    self.delegate = theDelegate; 
    ...some code here... 
    connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 
} 
return self; 

所以我不能正常釋放它,如果我自動釋放它崩潰。調用類的工作是釋放嗎?如果是這樣,只是釋放initilised對象還釋放連接,或者你需要特別發佈它?如果是的話,你會怎麼樣?

感謝

回答

3

connection設爲實例變量並按需發佈。 「誰」應該釋放對象的問題嚴格依賴於對象的語義和層次結構。

+0

是的想到這一點,但想看看是否有一個公約釋放它。 – Rudiger

+1

+1約定是你保留你關心的東西,然後釋放你不再關心的東西。在幾乎所有可以想象到的情況下,如果你關心它,你就會把它放在伊娃裏。蘋果通過在示例代碼中不創建NSURLConnection的ivar來對新開發人員造成很大損害。它「起作用」是因爲NSURLConnection的實現細節,但它很混亂,並設置了一個不好的例子。使用伊娃。 –

+0

啊k,感謝那 – Rudiger

0

你爲什麼一個構造函數中打開一個NSURLConnection

通常,您的構造函數不應該執行此類工作。如果連接關聯到對象,我會在對象的dealloc方法內使對象的屬性爲connection,對象的屬性爲[connection release];

+0

我認爲它來自蘋果代碼。多數民衆贊成在我想做的事情,但不知道是否有更好的公約釋放這樣的記憶 – Rudiger

0

請記住,你不應該把你的信仰放在鏗鏘聲中。它可以並且確實報告錯誤的否定和誤報。

Clang每天都在好起來,但它現在還處於起步階段。很好,它與Xcode很好地集成在一起,但請記住它有一些缺陷。

在這種情況下,它取決於你存儲連接對象的變量的範圍。如果它被聲明爲一個實例變量,那麼它應該沒問題,只要你在dealloc中釋放它或者在某些當你完成它的其他時候。

如果像您在您的問題中發佈的那樣,connection的聲明在您的init方法中是本地的,那麼Clang會正確報告泄漏。您應該使connection成爲實例變量或屬性,並確保您在dealloc中或在完成時釋放它。

+0

是的,我知道,但我確實覺得它會泄漏。我確實分配了內存,不要在任何地方釋放它。雖然如果調用類發佈它,那麼clang會顯示一個錯誤,但我會知道我正在處理它,所以我會忽略clang。 – Rudiger