如果我有一个只有少数事件处理程序注册的应用程序(并且在应用程序关闭之前使用事件的对象不会被处理),我是否真的需要担心注销那些处理程序?我能看到的唯一好理由是,如果您不需要关心的事件(即您有多个处理程序注册到一个事件),那么可能会有一点额外的开销。还有其他什么好的理由吗?任何人都遇到重大问题,因为他们没有注销事件?不注销事件处理程序不好吗?
53
A
回答
68
如果你有A
发布事件,并B
订阅事件(处理程序),那么它只是一个问题不是是否A
想要住了很多长于B
退订。基本上,事件订阅意味着A
仍然可以看到B
,这样可以防止它被垃圾收集,并且即使您忘记了它(也可能是Disposed()
),它仍会在其上触发事件。
例如,这是一个问题,如果A
是一个静态的事件,您的应用程序运行一段时间B
死后......
这要注意的是,有人可能会问如下:
如果B的寿命比A长得多,B会不会将垃圾收集起来?
而且答案是“否”。 B通过该事件没有提及A; A将被正常收集
14
许多人似乎认为,如果发布商要超过订阅者,取消订阅活动就非常重要。我不喜欢这种方法。事件订阅者不会从发布者中分离出来,这会对发布者和订阅者以外的实体的行为产生一些令人讨厌的依赖关系。如果对发布者的引用持续时间超过预期,那么这将保持用户活着,以及用户持有引用的任何对象。如果大量被抛弃的对象被事件处理程序相互关联,但其中没有任何实时引用存在,则所有对象都可以被垃圾收集器清理。但是,如果有人意外地保留了其中一个对象的引用,那么可能会阻止任何对象被垃圾收集。
恕我直言,主动删除事件处理程序比放弃它们更好,希望一切都被清理干净。除非可以肯定的是,没有意外的引用发布者可以存在,这种方法可能“主要”工作,但偶尔会造成内存泄漏。
相关问题
- 1. Symfony注销处理程序
- 2. 处理程序不处理事件
- 3. ASP.NET注销事件处理程序和页面的Site.Master
- 4. Guava eventBus在注销时报告“丢失事件处理程序”
- 5. 是否需要注销事件处理程序?
- 6. JBPM 5 - 如何从TaskService注销任务事件处理程序
- 7. Javascript:最好的地方注册事件处理程序
- 8. 注册事件处理程序在CQRS
- 9. 注销会好吗?
- 10. Spring Security中的注销处理程序
- 11. 事件处理程序事件处理程序不调用上单击按钮
- 12. 编写内联事件处理程序是不好的做法
- 13. 在HTML中使用内联事件处理程序是不好的做法吗?
- 14. 火狐不注册onclick事件处理程序
- 15. 事件处理程序不工作asp.net
- 16. 事件处理程序不工作
- 17. JavaScript事件处理程序不工作
- 18. Flex事件处理程序不工作
- 19. removeEventListener不参考事件处理程序
- 20. Dojo事件处理程序不工作
- 21. 活动不被事件处理程序
- 22. oneclick事件处理程序不执行
- 23. 事件处理程序不工作
- 24. WeakEventManager - 不叫事件处理程序
- 25. onclick事件处理程序不火
- 26. .load事件处理程序不工作
- 27. 事件处理程序不JS
- 28. 春季安全注销不打成功处理程序,裁判
- 29. 处理注销的更好方法
- 30. MapController调用在事件处理程序中不起作用吗?
这是特别糟糕的,如果B是资源沉重... – 2009-06-30 04:34:58