天天看點

【MyBean調試筆記】關于單元的釋放順序

【概述】

DEMO送出人:惠商軟體  2508696439

問題描述:MDIConsole, DEMO如果Forms單元引用順序放在mybean.console.pas檔案之後如下圖所示時:

【MyBean調試筆記】關于單元的釋放順序

建立同一EXE内的MDI子插件并顯示,在不關閉MDI子窗體的情況下,關閉主EXE時,會造成關閉時産生通路違規錯誤。

【MyBean調試筆記】關于單元的釋放順序

【調試過程】

看了問題,能重制,能重新的問題就不算什麼問題了,一定可以找到原因的,開啟debug dcus後,發現錯誤停留産生時,停留在Screen.FSaveFocusedXXX這一句。調試發現果然Screen為nil了。

【MyBean調試筆記】關于單元的釋放順序

【問題分析】

mybean在建立插件TComponent子插件時會傳入beanFactory.VclOwners, 這樣在程式關閉時,清理類工廠時,會釋放他,并清理他的子元件,達到自動清理的插件的目的,因為getBean的插件沒有手動關閉,是等待清理beanFactory時進行清理的,清理的時候,Screen已經被清理,是以産生了該錯誤。

我們看看工程檔案的引用順序

上面代碼來看是會先清理Forms,然後再清理mybean.console,和mybean.core.beanFactory單元,但是因為mybean.core.beanFactory裡面引用了Forms單元,是以清理順序變成了

1.mybean.core.beanFactory,

2.Forms,

3.mybean.console,

mybean.console單元中管理了所由的類工廠插件接口,因為類工廠是通過接口來決定生命周期的,是以在清理mybean.console單元的時候,才會釋放最後一個工廠接口的引用,也就是釋放vclOwners和他的子插件,這個時候application和screen執行個體都已經被釋放了。是以procedure TCustomForm.BeforeDestruction;中通路Screen才會引發異常。

現在來優化下mybean的核心類。

mybean.core.beanFactory和mybean.console單元中都引用Forms單元,這樣不管你順序怎麼調整,都讓Forms單元成為在這兩個單元後面。然後在mybean.core.beanFactory被清理時,清理工廠接口資源。

使順序變成這樣

2.mybean.console,

3.Forms。