Interface的新语法,标签 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
原来的 Delphi 里面的 Interface,一个 Object 有 Interface,它就有引用计数。如果使用它的 Interface 的变量都设置为 nil,则它的引用计数自动变成 0,然后会自动被 Free 掉。前提当然是这个 Object 是继承自 TInterfacedObject
DELPHI 不知道从什么时候起,增加了 【标签】这个语法。对于 Interface 来说,有两个标签。假设我们有一个 Interface 是 IMyIntf = Interface 然后,假设有个变量: var MyInf: IMyIntf; 可以定义为: var [unsafe]MyIntf: IMyIntf; 还可以定义为 var [weak]MyIntf: IMyIntf; 使用标签,尤其是这两个标签,区别是什么呢? 1. 使用 [unsafe] 标签,表示 MyIntf 不被编译器做引用计数管理。也就是当 MyIntf := nil; 的时候,它对应的对象的引用计数不会变。(Weak references also avoid increasing the reference count, but they are managed. 編輯記錄
pcplayer99 重新編輯於 2016-04-30 19:03:38, 註解 無‧
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
請問 Interface 中的「引用计数」,是要用在什麼地方呢?
寫Delphi這麼久了,完全不知道這個要用在什麼地方 ===================引 用 pcplayer99 文 章=================== 原来的 Delphi 里面的 Interface,一个 Object 有 Interface,它就有引用计数。如果使用它的 Interface 的变量都设置为 nil,则它的引用计数自动变成 0,然后会自动被 Free 掉。前提当然是这个 Object 是继承自 TInterfacedObject DELPHI 不知道从什么时候起,增加了 【标签】这个语法。对于 Interface 来说,有两个标签。假设我们有一个 Interface 是 IMyIntf = Interface 然后,假设有个变量: var MyInf: IMyIntf; 可以定义为: var [unsafe]MyIntf: IMyIntf; 还可以定义为 var [weak]MyIntf: IMyIntf; 使用标签,尤其是这两个标签,区别是什么呢? 1. 使用 [unsafe] 标签,表示 MyIntf 不被编译器做引用计数管理。也就是当 MyIntf := nil; 的时候,它对应的对象的引用计数不会变。(Weak references also avoid increasing the reference count, but they are managed. |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
引用計數不是給你用的,是管理 COM 物件生命週期的機制
Delphi 的 interface,其實跟 COM interface 是有關係的,這就是為什麼每一個 interface 都會帶一個 GUID 的原因 而 COM 物件的生命週期管理,用的就是「引用計數」,也就是有多少個變數指向 (引用) 這個物件 當這個數字歸 0 時,COM 物件就會被系統回收 例如:(語法不一定對,只是舉例) a := CreateObject('SomeInterface'); // 物件被建立,同時引用次數 = 1 (變數 a) b := a; // 引用次數 = 2 (變數 a, b) a := null; // 引用次數 = 1 (變數 b) b := null; // 引用次數 = 0,物件被系統回收 所以只要記得一件事,使用 COM 物件時,用完記得把指向 COM 物件的變數清空 ===================引 用 GrandRURU 文 章=================== 請問 Interface 中的「引用计数」,是要用在什麼地方呢? 寫Delphi這麼久了,完全不知道這個要用在什麼地方
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
Delphi 最早出现 Interface 的确是为了给 COM 使用。
现在,在不需要 COM 的地方,你定义一个 class,也同样可以使用 interface。使用 Interface 的最大好处是可以用 interface 的方式,实现类似多态、多继承。 在引用计数上,假设有一个 interface: IMyInterface = interface procedure Hello; end; 有一个 class TMyClass = class(TComponent, IMyInterface) 有一个 Object: A: TMyClass; 然后,你声明了两个 interface: B: IMyInterface; C: IMyInterface; B := A as IMyInterface; 则 A 的这个 interface 的引用计数加1; C := B; 则引用计数再加1; C := nil; 则引用计数减1; 如果,你的 TMyClass = class(TInterfacedObject, IMyInterface) 则因为 TInterfacedObject 内部的 code 在发现引用计数为 0 的时候会释放这个 Object,因此,这个 Object 自动释放。这个是可以去看 TInterfacedObject 的 Code 来知道的。 因此,如果你 TMyClass 不是co那个 TInterfacedObject 继承的,则引用计数变成 0 的时候,是否自动释放,由你自己写 code 来决定。 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
只要有 interface,就有引用計數,自delphi很早版本的時候(忘記何時?可能是d3?) 就有這東西。
他描述的是因應手機上的程序,因為 iphone 的app,裡面用的是ARC的記憶體管理,ARC中就會有關於 unsafed 與 weak 的差別。而關於 weak 與 unsafed的唯一差別應該是 weak 物件被發現沒被引用後,(其實它不是1就是0,1是被創的時候,然後就再也不會增加,直到它自己離開了自己的scope後,會變0),物件釋放,且物件會被指向 nil 。 而 unsafed 則完全要程序員自己決定生死與nil與否。 若要完整的了解新的 unsaged 與 weak,甚至預設的 strong,最好是讀 ios 開發手冊裡的資料。 btw,ruru,你應該是不曾深入去使用interface,所以不了解inteface內部的「引用計數」實作。若要了解這些事,要研讀 delphi 的interface 相關深入文章。接著才是目前最新的ARC 管理… ===================引 用 GrandRURU 文 章=================== 請問 Interface 中的「引用计数」,是要用在什麼地方呢? 寫Delphi這麼久了,完全不知道這個要用在什麼地方 ===================引 用 pcplayer99 文 章=================== 原来的 Delphi 里面的 Interface,一个 Object 有 Interface,它就有引用计数。如果使用它的 Interface 的变量都设置为 nil,则它的引用计数自动变成 0,然后会自动被 Free 掉。前提当然是这个 Object 是继承自 TInterfacedObject DELPHI 不知道从什么时候起,增加了 【标签】这个语法。对于 Interface 来说,有两个标签。假设我们有一个 Interface 是 IMyIntf = Interface 然后,假设有个变量: var MyInf: IMyIntf; 可以定义为: var [unsafe]MyIntf: IMyIntf; 还可以定义为 var [weak]MyIntf: IMyIntf; 使用标签,尤其是这两个标签,区别是什么呢? 1. 使用 [unsafe] 标签,表示 MyIntf 不被编译器做引用计数管理。也就是当 MyIntf := nil; 的时候,它对应的对象的引用计数不会变。(Weak references also avoid increasing the reference count, but they are managed.
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |