2011-06-27 34 views
1

有人請向我解釋爲什麼viewcontroller dealloc方法不會被調用時,我按下uinavigationcontroller後退?何時取消在uinavigationcontroller nsurlconnection

我想正確取消我的nsurlconnection,因此它不會嘗試顯示彈出並崩潰,因爲它的委託不再有效。

NSURLRequest *request = [ [ NSURLRequest alloc ] initWithURL: [ NSURL URLWithString: [ NSString stringWithFormat: @"http://www.url.com" ], string1, string2 ] ] ]; 

connection = [ [ NSURLConnection alloc ] initWithRequest: request delegate: self ]; 

[ request release ]; 

我釋放connectionDidFinishLoading和didFailWithError連接,但我想,當用戶按下後退按鈕取消和釋放連接:

我NSURLConnection的如下初始化。最合乎邏輯的地方似乎是dealloc方法,但我懷疑這不會被調用,因爲連接保留了viewcontroller。

當按下後退按鈕時,確保連接被取消的最佳方法是什麼?我不想使用viewwilldissapear,因爲我以模態方式呈現另一個視圖控制器,這不應該成爲取消的理由(除非在模式視圖控制器中會出現相同的問題,彈出+崩潰)。

+0

'NSURLConnection'does在初始化時保留其委託並在連接完成加載,失敗或取消時釋放它。 – albertamg

+0

如何處理暫停?在出現超時彈出窗口之前,用戶將彈出視圖控制器。當最終發生超時時,會導致崩潰.. :-( – Ivo

+0

「... crash,因爲它的委託不再有效」。如果NSURLConnection保留它的委託,確保它不是'dealloc 'ated(除非它被過度釋放到其他地方)? – albertamg

回答

0

我建議你使用viewwilldisappear。即使您呈現另一個模式視圖控制器沒有問題。只要在你的視圖中這樣做就會消失。在.h文件中聲明ur連接對象然後

if(urConnection){ 
    [urconnection Cancel]; 
    [urconnection release]; 
} 
if(urConnection){ 
    [urconnection Cancel]; 
    [urconnection release]; 
} 
+0

我會接受這個答案,因爲它最有用的。最後,我解決了我的問題,除非viewcontroller當前可見,否則不會在connectiondidfailwitherror中顯示任何彈出窗口。如果它不可見,我只是釋放所有剩餘的內存。 – Ivo

0

那麼,最好在dealloc方法或connectionDidFinishLoading委託中釋放連接對象。但我不認爲它用於釋放後退按鈕上的連接,因爲一旦後退按鈕被按下,對象就會自行銷燬並調用dealloc方法。所以,使用dealloc方法放置代碼來釋放連接。

+0

我想在dealloc方法中釋放連接,但是當它在x分鐘後有連接超時時,它不會被調用,只有當超時發生時dealloc纔會被調用,但是到那時爲止已經太晚了, m在不同的viewcontroller。我想每個人都需要取消他們的掛起連接時viewcontroller彈出(假設你設置代理爲自己的連接)? – Ivo

相關問題