程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 使用Dephi組件的生存期管理

使用Dephi組件的生存期管理

編輯:Delphi
?眾所周知,創建型設計模式中的都會創建對象。
  可是對象在哪兒釋放呢?
  當然,對於抽象工廠和工廠方法以及原型模式中,可以保存一個引用然後在需要的地方把它釋放掉。可Singleton模式中卻沒有這樣的引用,或是不能確定它是否創建了。
  此時,Dephi的組件的生存期管理機制就非常有用了,你只需要從TCompenent繼承,並在構造函數中把自己的Owner設為另一個被管理的組件(一般來說是你的Form,Frame之類),你創建的對象就會在它的Owner被釋放時自動釋放掉。呵呵,再也不用羨慕Java程序員了:)
  什麼時候從TCompenent繼承使用?
  我的建議是:只要可以任何時候。
  由於在創建類的時候不能預測它的使用方式(我不能,也許你能),所以最好新建類都從TCompenent或TCompenent的派生類繼承,這樣可以防止以後對象的生存期不好處理,而且TCompenent實現了IInterface接口,由於我們的所有的接口都是從IInterface繼承(IUnknow也是),所以如果的你的類想實現接口的話,也最好從TCompenent或TCompenent的派生類繼承,否則的話你必須自己實現下面這三個方法。
  ??? function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  ??? function _AddRef: Integer; stdcall;
  ??? function _Release: Integer; stdcall;
  當然如果你要必須要繼承的基類不是從TCompenent繼承的,那我也沒什麼好辦法啦。
  什麼時候自己釋放什麼時候交給Owner釋放?
  先說一下區別,自己釋放可以更加有效的利用資源,有更少資源占用。由Owner釋放,可以減少錯誤率,減少代碼編寫量,使代碼更簡潔。
  所以,如果你需要多次創建創建次數未知的就要手動釋放,只創建一次或有限次並對資源占用影響較小的就由Owner釋放好了。一個簡單的原則,所有在你覆蓋 Detroy中釋放的對象都可以由Owner釋放。在方法中創建的臨時變量絕對不能這樣設,因為雖然最後對象還是被釋放,但是你可能會多次創建同一個對象,造成大量的資源浪費,除非你把它實現成Singleton。
  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved