在哪里删除 Xamarin iOS 中的通知观察者?
Posted
技术标签:
【中文标题】在哪里删除 Xamarin iOS 中的通知观察者?【英文标题】:Where to remove Notification observer in Xamarin iOS? 【发布时间】:2018-06-20 13:00:50 【问题描述】:我正在 Xamarin 项目的 ViewDidLoad() 中注册通知。但是我看不到任何可以“删除”观察者的方法。即使视图不可见,我也需要执行某些操作,所以我不能在 ViewWillAppear 中给出它。有没有类似于“deinit”方法的东西。
在 C# 中尝试了“dispose”方法,但没有被调用。
即使在执行“PopViewController”之后,观察者仍然没有被取消注册。不知道为什么即使删除了视图控制器,它也没有从内存中释放出来。
【问题讨论】:
我认为 de initializer 是最好的地方 @SPatel Xamarin ios 的反初始化器的 C# 等效项是什么? 【参考方案1】:根据您的需要,您可以覆盖 ViewWillAppear
和/或 ViewDidDisappear
以在此处添加/删除它。
public override void ViewWillAppear(bool animated)
base.ViewWillAppear(animated);
// subscribe
public override void ViewDidDisappear(bool animated)
base.ViewDidDisappear(animated);
// unsubscribe
请记住,ViewDidDisappear
将在新控制器被推到当前控制器顶部时调用,ViewWillAppear
将在新控制器弹出时再次调用,这可能不适合您尝试的任何操作去做。
【讨论】:
正是这不适合我想要实现的目标。就我而言,无论视图何时可见,我都必须执行一些操作。这就是我在 ViewDidLoad 中注册它的原因。 当控制器不再在堆栈上时,您想在什么时候移除观察者?您还可以覆盖Dispose
并在那里或在您的控制器的终结器中执行此操作。
是的,当控制器不在导航堆栈上时。尝试在 C# 中使用“dispose”方法,但没有成功。知道如何使用该方法吗?
Here's 是如何使用它的一个很好的例子。值得一提的是,即使在您弹出控制器之后,它仍然可以在垃圾收集器处理它之前在内存中停留一段时间。
尝试了以下链接中给出的解决方案(覆盖 Object.Finalize 的派生类的处置模式)。当我弹出视图控制器时,什么都没有被调用。我已经放置了控制台日志来验证相同的内容。不确定我是否在这里做错了什么。 docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…【参考方案2】:
您可以在 ViewDidLoad 中对事件进行所有订阅,并且取消订阅它们会从 IO 自动发生。如果您真的想取消订阅,请在 Dispose 方法中进行。
这是一个例子,
在ViewController中,
// Subscribing
public override void ViewDidLoad()
_homeView.HomeButton.TouchUpInside += OnHomeButtonClicked;
// Unsubscribing
protected override void Dispose(bool disposing)
_secondView.SecondButton.TouchUpInside -= OnSecondButtonClicked;
base.Dispose(disposing);
【讨论】:
ViewDidUnload
自 iOS 6 起已被弃用
是的,即便如此,ViewDidUnload
只有在设备内存不足并需要释放一些内存时才会被调用
在@Nick 发表评论后,我做了一些广泛的研究,发现在 IOs 6+ 中,这种方法永远不会被用于在低内存下处理视图的方式。而且也没有必要在 viewController 中取消订阅监听器。如果确实需要完成,那么应该在 DidReceiveMemoryWarning 覆盖的方法中完成。我已经相应地更新了答案!
DidReceiveMemoryWarning
也不适合这样做,尤其是在较新的硬件上,可用内存量可能永远不会变得足够低,无法调用该方法。
我看到 Dispose 是取消订阅听众的地方。最重要的是,取消订阅并不是必须的,IO 会自动处理它?以上是关于在哪里删除 Xamarin iOS 中的通知观察者?的主要内容,如果未能解决你的问题,请参考以下文章
标签栏(视图控制器)中多次调用ios的通知中心方法方法?如何删除观察者?
使用 Azure 中的集线器注册推送通知时,Xamarin.iOS 本机崩溃错误 SIGSEGV