此时相当于直接把地址清零,不会调用_IntfClear。
我倾向于使用第二种方法,这样你就不用考虑先释放谁的问题了。而且有些设计模式中你可能只持有接口引用,而且你也不知道引用的对象什么时候释放,此时就必须使用方法2。
例如考虑Composite模式。
TComposite = class(TComponent, I1)
Private
interList: TXContainer;//一个容器类,存放“叶子”的接口引用。
Public
Procedure Add (AIntf: I1);
function DO: Boolean;
End;
它应该释放它的“叶子”吗?显然不是,那“叶子”是不是一定会晚于这个“合成对象”对象释放呢?我想也不一定吧。如果强制这样规定的话,就失去很多的灵活性。所以我们肯定想这些接口引用置nil时,不会和原对象发生什么关系,以免对象被释放后出非法地址访问错误。考虑使用什么容器呢?array?TList?TInterfaceList?
首先想到肯定是TInterfaceList了,因为我们是要容纳的就是接口。但是对他进行Free时,它会把它所有容纳的接口置为nil,这正是我们不想要的。或者我们可以在Free之前先把它存储的接口引用转为指针再置为nil。
for I := 0 to interList.Count -1 do
Pointer(interList.Items[i]) := nil;
可惜的是,编译错误“[Error] XXXX.pas(XX): Left side cannot be assigned to”。
然后我们试一下array。
interList: Array of I1;
动态数组是不要释放的。好像很好用,但是编译器释放它时还是会对每个元素置为nil的,而且是作为接口,仍然有非法地址访问错误的可能。可以这样
for i := Low(arr) to High(arr) do
Pointer(arr[i]) := nil;
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



