全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:603
推到 Plurk!
推到 Facebook!

Interface的新语法,标签

 
pcplayer99
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-04-30 19:02:01 IP:36.36.xxx.xxx 訂閱
原来的 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
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-05-01 12:48:51 IP:59.115.xxx.xxx 訂閱
請問 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
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-05-07 09:04:11 IP:59.127.xxx.xxx 訂閱
引用計數不是給你用的,是管理 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
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-06-01 14:01:10 IP:120.237.xxx.xxx 訂閱
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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-06-01 16:45:49 IP:212.160.xxx.xxx 訂閱
只要有 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
系統時間:2017-11-24 2:36:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!