Delphi XE10.1 引用计数
2018-06-17 18:58:38来源:未知 阅读 ()
以往的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;
运行结果
Ptr:16360080 Ptr:0
weak引用非常适合用于两个对象需要互相引用的情况下,如果以往的引用,将无法让引用计数器清0.
如下面的例子,互相引用后,两个对象的计数器都不清0,导致内存泄漏
type ISimpleInterface = 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;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Delphi10.3的ListView学习(大图标) 2020-06-05
- Delphi10.3的SpeedButton/BitBtn学习 2020-06-05
- Delphi10.3状态栏上显示进度条/图片 2020-06-02
- Delphi10.3下自带系统托盘 TrayIcon的使用 2020-06-01
- delphi10.3安装使用mySQL 2020-05-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash