XComponent
From Apache OpenOffice Wiki
如果实现在内部持有对另一个 UNO 对象的引用,可能会出现循环引用的问题,导致您的组件或另一个对象永远不能被销毁。如果另一个对象持有对您的组件的引用,则可以实现包含方法 dispose()
的 com.sun.star.lang.XComponent。专业 UNO - UNO 概念 - UNO 对象的生存期 详细介绍了这个问题。
在 C++ 或 Java 组件中支持 XComponent
很简单,因为可以从能够实现 XComponent
的帮助程序类导出。如果必须手动实现 XComponent
,请参见以下代码示例。
接口 XComponent
指定这些操作:
// module com::sun::star::lang interface XComponent: com::sun::star::uno::XInterface { void dispose(); void addEventListener( [in] XEventListener xListener ); void removeEventListener( [in] XEventListener aListener ); };
这样,XComponent
对象的所有者可以解决潜在的循环引用。com.sun.star.lang.XEventListener:
// module com::sun::star::lang interface XEventListener: com::sun::star::uno::XInterface { void disposing( [in] com::sun::star::lang::EventObject Source ); };
XComponent 的处置
XComponent
的设计意图是对象由第三个对象实例化,使第三个对象成为第一个对象的所有者。所有者可以调用 dispose()
。所有者对您的对象调用 dispose()
时,必须执行三个操作:
- 释放它持有的所有引用。
- 通知已注册的 XEventListener,通过调用它们的方法
disposing()
来处置对象。 - 以后尽可能地保持被动。如果处置之后调用实现,则在不能完成方法规范时抛出 com.sun.star.lang.DisposedException。
这样,XComponent
对象的所有者可以解决潜在的循环引用。
Content on this page is licensed under the Public Documentation License (PDL). |