官术网_书友最值得收藏!

Interfaces

From the viewpoint of memory management, interfaces in Delphi are implemented as classes with added reference counting. To create an interface, you actually have to create an object of a class, which will get a reference count of 1. If you then assign this interface to another variable, both will point to the same memory and the reference count will be incremented to 2.

There is no equivalent to SetLength or UniqueString that would make a unique copy of an interface. That would require duplicating the underlying object and Delphi has no built-in support for that.

The object implementing the interface is destroyed when its reference count falls to 0:

var
i1, i2: IInterface;
begin
i1 := TInterfacedObject.Create;
// i1 points to an object with reference count 1
i2 := i1;
// both i1 and i2 point to a same object with reference count 2
i1 := nil;
// i2 now points to an object with reference count 1
i2 := nil;
// reference count dropped to 0 and object is destroyed
end;

Although interfaces are very similar to classes, all this reference count management takes its cost. It is implemented with something called interlocked instructions which are a bit slower than normal increment/decrement instructions. I'll discuss this in more detail in Chapter 5, Getting Started with the Parallel World.

This only makes a measurable difference when you are assigning interfaces a lot, but sometimes this is exactly what happens. I'll show an example in the next section.

主站蜘蛛池模板: 昌邑市| 泰宁县| 柘荣县| 扎兰屯市| 扶绥县| 吴桥县| 乌兰察布市| 图木舒克市| 资中县| 万全县| 双桥区| 镇坪县| 北京市| 加查县| 区。| 新野县| 桑植县| 崇州市| 保靖县| 本溪| 扶余县| 仁布县| 孟连| 乡城县| 邵东县| 西乡县| 苏尼特右旗| 乌拉特前旗| 黎平县| 克什克腾旗| 钟祥市| 邹平县| 富民县| 同江市| 大新县| 浮山县| 和平区| 城固县| 通许县| 双牌县| 报价|