1
2
您需要存储对对象的引用。 事件朝另一个方向工作,使事件将向活动的对象(而不是事件源)开火。 如果您向gc.collect和gc.waitForPendingFinalizers添加一些调用,我确信您可以很快地引发问题。 让我再充实一下我的答案。 一个事件基本上只是一个伪装的代表。伪装只是删除了一些与委托相关联的功能,这样外部代码就不能对底层委托执行它想要的任何操作,但本质上,它是一个普通的委托。 那么什么是代表呢?引用单个方法的委托包含两个内容:
当定义该事件的对象调用该事件时,例如“button.click”正在激发的事件,特定方法(例如bt_click)将在特定对象(例如form1的实例)上激发。 因此,事件包含一个引用 向外地 ,指向定义方法的对象。事件不会对另一个对象做任何操作,因此其他对象(如上面的示例中的Form1)不会以任何方式与此事件相关,包含对该对象的引用。 因此,在您的案例中,假设您有以下代码:
如果现在让该变量超出范围,则该对象符合收集条件,因为没有任何内容包含对它的引用。AppSubclass和SpecialAppWndProc之间存在内部引用并不重要,这两种方法都可能存在引用,但如果没有外部代码持有对它的引用,则这些对象可以进行收集。 所以您需要将对象的引用存储在某个地方,以避免被收集。 为了回答你最初的问题,“C”:什么在破坏我的NativeWindow对象,为什么?,答案是垃圾收集器破坏了NativeWindow对象,原因是没有对它的根引用(根引用是指存储在静态变量中的引用、其他根引用的成员变量或活动方法中的局部变量)。 |