2011-02-06 26 views
0

Apple guide對於釋放連接對象非常具體:它在didFailWithErrorconnectionDidFinishLoading中完成。帶有NSURLConnection的異步請求:何時發佈

然而,當我這樣做,我後來在zombi模式

*** -[NSURLConnection releaseDelegate]: message sent to deallocated instance 0x1001045b0 

似乎得到這個,有一個在AppKit的一些代碼,釋放我的連接。

我很樂意假設蘋果指南是錯誤的,但不想得到一些可怕的內存泄漏或引入一些細微的不兼容與舊的OSX版本或類似的東西。

在這種情況下忽略文檔安全嗎?

編輯
代碼創建請求

URLConnectionDelegate *delegate = [[URLConnectionDelegate alloc] initWithSuccessHandler:^(NSData *response) { 
     ... 
    }]; 
    [NSURLConnection connectionWithRequest:request delegate:delegate]; 

    // I do not release delegate when testing for this issue, not sure whether I should in general 

Delegate類本身

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    successHandler(receivedData); 

    [receivedData release]; 
    Block_release(successHandler); 

    // do we really need this???????? 
    [connection release]; 
} 
+0

從文檔:'NSURLConnection`在初始化時保留其委託。它會在連接完成加載,失敗或取消時釋放委託。'看起來您已經過度釋放委託。 – 2011-02-06 02:29:49

+0

@Bavarious我不在這裏發佈代表。 (我是否應該是另一個問題)當我添加`[連接釋放]時出現錯誤;`當我刪除它時消失。 – 2011-02-06 02:32:21

回答

3

既然你已經創建了

[NSURLConnection connectionWithRequest:request delegate:delegate]; 

你不」的連接擁有該連接對象,因此您不應該釋放它。

這就是說,我不會推薦它。如果你沒有擁有一個對象,你不能保證它會超過自動釋放池的消耗週期,也就是說,在連接對象完成加載之前((自動)釋放)可能會出現這種情況。相反,創建一個保留聲明的屬性來保持連接:

@property (retain) NSURLConnection *connection; 

連接對象分配給聲明的屬性:

self.connection = [NSURLConnection connectionWithRequest:request 
    delegate:delegate]; 

,當連接完成加載或失敗時,通過分配nil釋放到聲明的屬性:

self.connection = nil; 

至於你的委託,如果它只需要在連接加載時存在,你可以autorelease它sinc e連接保留委託:

URLConnectionDelegate *delegate = [[[URLConnectionDelegate alloc] 
    initWithSuccessHandler:^(NSData *response) { 
    // … 
}] autorelease]; 

self.connection = [NSURLConnection connectionWithRequest:request 
    delegate:delegate];