Intf1 := OBJ2;
Intf1.DO;
Finally
OBJ2.Free;
End;
结果可能还会出你的意料,还是非法地址访问错误。为什么?因为Delphi编译器耍了个小聪明,它认为你忘记把这个地址引用置为nil了,所以你会自动给你加上,看来Delphi编译器聪明过头了J。
怎么解决呢?
方法1,先把接口引用置为nil,再释放对象。
Intf1 := nil;
OBJ2.Free;
方法2,把接口引用强制转成指针类型再置为nil。
Pointer(Intf1) := nil;
此时相当于直接把地址清零,不会调用_IntfClear。
我倾向于使用第二种方法,这样你就不用考虑先释放谁的问题了。而且有些设计模式中你可能只持有接口引用,而且你也不知道引用的对象什么时候释放,此时就必须使用方法2。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/