4

我曾经使用 Objective-C 语言开发 iOS 应用程序,并依靠该dealloc方法在我的应用程序中执行一些清理/注销任务。现在在 MonoTouch(垃圾收集)上,它不再是一个选项。

假设我有一个添加(子类)的实例UIViewController作为其属性的子视图。反过来注册自己以接收来自另一个管理器/全局对象的一些事件,以便它知道如何相应地更新自己(例如:)。ViewMyViewUIViewMyViewonlineProfilesManager.Refreshed += () => <update UI with the new state>;

只要MyView在屏幕上,一切都很好。但是我必须知道它何时从屏幕上删除,以便我可以MyView从事件处理程序中注销。

在 Obj-C 中,这可以简单地在dealloc方法中完成,因为当屏幕更改时,它会UIViewController被释放 -->MyView从它的超级视图中删除,然后MyView调用 dealloc 方法。

在 Monotouch 中,我不再有这种“确定性”流程。我试图在UIViewControllerandMyView析构函数中放置一些打印语句,但它们从未被调用(原因是因为MyView仍然为事件处理程序注册,因为我不知道何时/如何取消注册它,它永远不会被释放)。

有谁知道在 MonoTouch 中处理这种情况的“模式”是什么?我认为我错过了一个基本概念并且在开发我的应用程序时遇到了麻烦。

提前致谢。


编辑 我正在编辑我的问题,因为看起来我的问题的解决方案是使用弱事件模式,但我没有找到 MonoTouch 平台的实现。

有谁知道如何在 MonoTouch 中使用弱事件模式?

4

2 回答 2

6

处理事件的最佳方法是在 ViewWillDisappear 中取消注册它们并在 ViewWillAppear 中注册它们。这意味着您不能使用匿名方法,因为您没有对该方法的引用来取消注册它。

如果这不适合您的需要,您可以执行类似于此http://sgmunn.com/blog/2012/05/non-gcd-event-handlers/的操作

干杯。

于 2013-02-26T00:21:48.867 回答
1

如果你正在寻找弱事件,你可以在这里尝试我的“Messenger”实现。

它的灵感来自TinyIoC中可用的内容,但我重新实现了它,因此它使用了更少的反射等。

于 2013-02-26T16:14:46.403 回答