2013-02-25 30 views
4

我曾經使用Objective-C語言開發iOS應用程序,並依靠dealloc方法在我的應用程序中執行一些清理/取消註冊任務。現在在MonoTouch(垃圾收集),它不再是一個選項。MonoTouch中的弱事件模式

假設我有一個UIViewController,增加了作爲它的一個子視圖的View財產MyViewUIView子類)的一個實例。 MyView又註冊自己接收來自另一個經理/全局對象的一些事件,以便它知道如何相應地更新自己(例如:onlineProfilesManager.Refreshed +=() => <update UI with the new state>;)。

只要MyView在屏幕上,一切都很好。不過,我必須知道它何時從屏幕上移除,以便我可以從事件處理程序取消註冊MyView

在對象 - 這可能在dealloc方法簡單地完成,因爲當屏幕改變UIViewController被釋放 - >MyView被刪除從它的上海華再MyView dealloc方法被調用。

在Monotouch中,我沒有這種'確定性'流程了。我試圖把一些打印語句放在UIViewControllerMyView析構函數中,但它們從不被調用(原因是因爲MyView仍然是註冊的事件處理程序,因爲我不知道何時/如何註銷它,它永遠不會解除分配)。

有沒有人知道在MonoTouch中處理這種情況的'模式'是什麼?我想我錯過了一個基本概念,並陷入了開發我的應用程序的困境。

在此先感謝。


編輯 我因爲長得像我的問題的解決方案是使用Weak Event Pattern但我沒有找到MonoTouch的平臺實現編輯我的問題。

有誰知道我該如何在MonoTouch中使用Weak Event Pattern

+4

嘗試重寫'Dispose'。這可能不適用於你的情況,但它(聽起來的方式)。讓我知道。 – jonathanpeppers 2013-02-25 23:58:55

+0

如果他重寫DisView on MyView,它可能無法正常工作,但如果他斷開MyViewController的Dispose重寫中的處理程序,它應該可以正常工作。 – jstedfast 2013-02-26 13:58:43

+0

@jstedfast @Greg Munn(下圖)建議我斷開/連接'ViewWillDisappear'和'ViewWillAppear'方法對中的事件處理程序。類似的情況是在'Constructor'和'Dispose'方法上執行此操作?如果UIViewController被事件處理程序捕獲,是否會調用Dispose? – 2013-02-26 14:40:37

回答

6

處理事件的最好方法是在ViewWillDisappear中註銷它們並將它們註冊到ViewWillAppear中。這意味着您不能使用匿名方法,因爲您沒有對註銷方法的引用。

如果不適合你需要什麼,你可以做類似這樣的http://sgmunn.com/blog/2012/05/non-gcd-event-handlers/

乾杯東西。

+0

'ViewWillAppear'和'ViewWillDisappear'聽起來很有趣,但如果一個ViewController想要呈現一個Modal View Controller(即檢索用戶信息)並使用事件處理程序接收結果呢?在提交模態視圖控制器時,根視圖控制器將調用ViewWillDisappear方法,因此將針對此類事件取消註冊。這是要點:我不知道要重寫哪個方法來執行註冊/取消註冊任務 – 2013-02-26 21:18:04

+0

'ViewDidUnload'也不是一個選項(它過時並且不保證在View控制器關閉時總是被調用) – 2013-02-26 21:21:39

+1

@ Eduardo Coelho View A以模態方式呈現視圖B>在這種情況下,您必須保留一個標記以知道B是否是模態。您也可以檢查PresentsViewController的值(它將是模態的)。 – 2013-02-26 23:48:07

1

如果你正在尋找弱勢事件,你可以試試我的「信使」實施here

它是由什麼是TinyIoC獲得啓發,但因此它使用較少的反射我重新實現它,等