2012-10-04 37 views
2

我有一個對象,充當我的視圖控制器和我的web服務之間的連接層。該對象需要一個委託,並在從服務器返回數據時通知該委託。我遇到了一個問題,當一個http請求正在運行時,委託被取消分配。當請求返回時,我的對象嘗試調用委託上的方法並且應用程序崩潰。iOS:如何處理髮布的代理

處理這個問題的最佳方法是什麼?我已經在幾個地方讀過,你不應該保留你的代表,因爲他們經常保留這個對象,導致循環依賴。所以,如果我不能保留我的委託,那麼在我調用它的方法之前,如何檢查它是否已被解除分配?

@property (nonatomic, assign) NSObject<ServerConnectionDelegate>* delegate; 
+0

也許使用'retainCount'?你在使用ARC嗎? – darksky

+3

@Darksky,**從來沒有**使用保留計數:) – Vladimir

+0

@Darksky,即使這是一個好主意,你不能調用'retainCount',因爲它會導致完全相同的錯誤(我試過)。 – mtmurdock

回答

3

通常,如果委託的生命週期比工作對象的生命週期長,則應該使用委託模式。 (對不起,不確定這裏的正確名詞)。

您有幾種選擇如何解決:

  • 作爲一種變通方法,您可以連接代理設置爲你的對象的dealloc方法爲零。
  • 如果需要數據(可能會稍後使用),您可以使用NSNotification來通知委託人任何連接事件而不是委託模式。
  • 正如傑克在他的評論中建議可以讓你的代理連接的弱屬性 - 這可能會是最好的解決辦法,如果你的項目使用ARC
+0

當你不使用ARC時,是否有一些與弱財產等價的東西? – mtmurdock

+0

查看本文http:// mikeash。com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html可能會有所幫助。 – Vladimir

+0

謝謝你的三個選擇!我從來沒有想過現在的弱點和分配! – darksider

0

您應該取消任何正在運行的請求,並將其委託設置爲無dealloc方法。

- (void)dealloc 
{ 
    [yourWebServiceRequest cancelRequestAndClearDelegate]; 
    [super dealloc]; 
} 
+0

是的,我正在考慮這一點,但我目前沒有舉一個對象的參考。我可以,但我試圖避免它。 – mtmurdock

+0

爲什麼你想避免它?這是一般模式。 – msk

+0

這也引入了您現在有一個外部依賴性的問題,其中每個希望成爲連接編組器對象委託的對象都必須實現dealloc幷包含該方法調用。通常使用網絡編組,這可能會是一個非常大的類(即每個視圖控制器,數據處理等) –