用接口来接管对象引用,以此来操作该对象,这种做法很常见,也很实用。
但是,在由于Delphi智能的接口机制,可能会让该操作隐含陷阱
首先,让我们简单看一下Delphi的接口机制:
一般,我们写的接口都继承自IInterface,实现接口的类也继承自TInterfacedObject,因为它们都替我们实现了
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
到这,问题就来了
以上两个接口生命周期相关的函数是上述接口和类自动替我们实现的
当将一个接口设置为NIL时,它所引用的对象也会被释放掉(的确让人恐怖)(Delphi调用_Release)
所以,当接口引用一个对象且这个对象的生命周期不确定时,这个自动的机制就留下了一个不大不小的隐患。
那到这你是不是想到了,不去手动将接口设为nil?嗯,听我接着说:
delphi的IInterface接口的生命周期是自管理的,因此,当这个接口不再被使用时,Delphi会认为你忘记把这个地址引用置为nil了,所以你会自动给你加上,那么历史又重现了。
那么怎么样避免这个陷阱呢?
我们不能直接将接口设为nil,为了绕开Delphi的自动管理机制,我们需要先将接口转换成指针,然后将它设为nil,这就避免了Delphi认为这个接口不再被使用,自动将其设为nil。
Pointer(IMyInterface) := nil;