2012-10-18 133 views
0

我在處理我的應用程序時遇到了一個有趣的問題。想象一個如果委託不存在,會發生什麼情況?

  • 存在着一個對象之情況,讓我們把它叫做A.
  • A,然後創建一些代表團基於類的一個對象(B),說NSURLConnection的。
  • 如果A已經實現了所有必需的委託方法,A就被指定爲B的委託。
  • A要求B開始處理。在我們的例子中,即從某個服務器獲取數據。
  • 只要乙完成獲取數據時,它將調用A.

的一些指定的方法在最後的步驟中,假設而調用的方法中,B發現目的犯規存在了。那麼會發生什麼?

我不確定,但會導致崩潰?

如果是,那麼請告訴我如何避免這種情況。

在我的情況下,我將viewcontroller分配給某個對象的代理,比方說viewDidLoad方法中的X.在X調用viewcontroller中定義的委託方法之前,有些情況下viewcontroller會被銷燬。

  • 如果將X的委託分配給nil解決了問題。然後 我應該這樣做。

總之,該方法而在其裝載階段卸載視圖控制器同樣 viewDidLoad的相位只調用一次。

+1

請注意,NSURLConnection *會保留它的委託。 – Guillaume

+0

@Guillaume是的,你是對的。關於保留代表的全部內容。如果我們將委託設置爲零,那麼更好。 – harshitgupta

+0

和是否definitelty它會導致崩潰。 – harshitgupta

回答

0

檢查一個有效的委託對象應該足夠了。

if (delegate) 
    [delegate method]; 
+0

具體說來NSURLConnection類,你的意思是它不會查找viewcontroller或viewcontroller的「 - (void)connectionDidFinishLoading:(NSURLConnection *)連接」方法,如果視圖控制器不再存在? – harshitgupta

+0

看看這個線程:http://stackoverflow.com/a/2503709/312312 – Lefteris

+0

如果委託被釋放,那麼「委託」將指向一些垃圾指針..我想(和MVC的設計模式會)更喜歡使用這種流量的通知。 –

1

你不應該達到,其中一個對象保存到可以在其他地方釋放不通知所有者對象另一個對象的引用的情況。

要麼當解除分配對象A通知對象B(通過在例如對象B使構件anill)或修改設計/流決不允許A之前B飾面被解除分配(例如,作爲在一個代理分配時保持AB如果可能的話)

1

的最佳方式實現這種班(其中A類可以在任何時候被釋放之間的通信)是聽NSNotifications
如您所述,使用弱(轉讓)代表是危險的,需要額外的考慮。
使用代表也可以創建一個內存膨脹(爲什麼我們應該保留一個視圖控制器很長時間後從視圖中彈出?)。

有關NSNotificationCenter和通知的更多信息,您可以在SDK文檔中找到大量信息..對於特定問題,您知道在哪裏詢問..

相關問題