Delphi XE10.1 引用计数

Delphi XE10.1 引用计数,第1张

概述以往的Delphi版本,不支持接口的Weak,和UnSafe的引用,支持对象的Weak, UnSafe,而且仅在Android和Ios平台上支持。 现在Delphi XE10.1 Berlin终于增加了对接口的Weak, UnSafe的支持。   1.Weak Weak引用,不影响引用计数器,但是如果对象被释放,Weak引用变量自动清0,来看例子: type TA=class(TInterfa

以往的Delphi版本,不支持接口的Weak,和UnSafe的引用,支持对象的Weak,UnSafe,而且仅在AndroID和Ios平台上支持。

现在Delphi XE10.1 Berlin终于增加了对接口的Weak,UnSafe的支持。

 

1.Weak

Weak引用,不影响引用计数器,但是如果对象被释放,Weak引用变量自动清0,来看例子:

type  TA=class(TInterfacedobject)   end; procedure TForm1.button1Click(Sender: TObject);var  a:IInterface;  [weak]aweak:IInterface;begin  a:=TA.Create;   //创建对象,复制给a,执行完成后引用计数器=1  aweak:=a;       //由于aweak定义有[weak]属性,所以赋值给aweak后,引用计数器依旧为1,但aweak变量的地址被保存到一个weak关联列表中  Memo1.lines.Add(Format(Ptr:%d,[NativeInt(Pointer(aweak))]));  a:=nil;         //由于引用计数器=1,执行此句后,计数器清0,对象被释放,同时与此对weak关联列表中所有变量也被赋值为nil,包括aweak变量.  Memo1.lines.Add(Format(Ptr:%d,[NativeInt(Pointer(aweak))]));end;

运行结果

1 2 Ptr: 16360080 Ptr: 0

weak引用非常适合用于两个对象需要互相引用的情况下,如果以往的引用,将无法让引用计数器清0.

如下面的例子,互相引用后,两个对象的计数器都不清0,导致内存泄漏

typeISimpleInterface = interface  procedure DoSomething;  procedure AddobjectRef (simple: ISimpleInterface);end; TObjectOne = class (TInterfacedobject,ISimpleInterface)private  anotherObj: ISimpleInterface;public  procedure DoSomething;  procedure AddobjectRef (simple: ISimpleInterface);end; ..................... procedure TObjectOne.AddobjectRef (simple: ISimpleInterface);begin  anotherObj:=simple;end; ..................... var  one,two: ISimpleInterface;begin  one := TObjectOne.Create;  two := TObjectOne.Create;  one.AddobjectRef (two);  two.AddobjectRef (one);

这时候在Delphi XE10.1 Berlin下可以用weak引用,来快速方便的解决泄漏问题:

private

   [weak] anotherObj: ISimpleInterface;  

2.UnSafe

 

unsafe引用,不影响引用计数,但不会向Weak引用那样清零引用的变量。

type  TA=class(TInterfacedobject)   end;procedure TForm1.button2Click(Sender: TObject);var  a:IInterface;  [unsafe]aunsafe:IInterface;begin  a:=TA.Create;  aunsafe:=a;  Memo1.lines.Add(Format(Ptr:%d,[NativeInt(Pointer(aunsafe))]));  a:=nil;  Memo1.lines.Add(Format(Ptr:%d,[NativeInt(Pointer(aunsafe))]));end;

运行结果

Ptr: 42640064 Ptr: 42640064

由于Unsafe引用,不影响应用计数器,下面的程序将导致内存泄漏:

procedure TForm1.button2Click(Sender: TObject);var  [unsafe] one: ISomeInterface;begin  one := TSomeObject.Create;  one.DoSomething;end;
总结

以上是内存溢出为你收集整理的Delphi XE10.1 引用计数全部内容,希望文章能够帮你解决Delphi XE10.1 引用计数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1274460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存