Delphi XE10.1 引用计数(Delphi XE10.1 Berlin终于增加了对接口的Weak, UnSafe的支持)
2021-02-01 21:16
标签:nil 需要 nsa dex format obj lines 属性 tab 以往的Delphi版本,不支持接口的Weak,和UnSafe的引用,支持对象的Weak, UnSafe,而且仅在Android和Ios平台上支持。 现在Delphi XE10.1 Berlin终于增加了对接口的Weak, UnSafe的支持。 1.Weak Weak引用,不影响引用计数器,但是如果对象被释放,Weak引用变量自动清0,来看例子: 运行结果 weak引用非常适合用于两个对象需要互相引用的情况下,如果以往的引用,将无法让引用计数器清0. 如下面的例子,互相引用后,两个对象的计数器都不清0,导致内存泄漏 这时候在Delphi XE10.1 Berlin下可以用weak引用,来快速方便的解决泄漏问题: 2.UnSafe unsafe引用,不影响引用计数,但不会向Weak引用那样清零引用的变量。 运行结果 由于Unsafe引用,不影响应用计数器,下面的程序将导致内存泄漏: https://www.cnblogs.com/hezihang/p/5536928.html#undefined Delphi XE10.1 引用计数(Delphi XE10.1 Berlin终于增加了对接口的Weak, UnSafe的支持) 标签:nil 需要 nsa dex format obj lines 属性 tab 原文地址:https://www.cnblogs.com/findumars/p/11579222.html
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
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);
private
[weak] anotherObj: ISimpleInterface;
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
procedure
TForm1
.
Button2Click(Sender: TObject);
var
[unsafe] one: ISomeInterface;
begin
one := TSomeObject
.
Create;
one
.
DoSomething;
end
;
文章标题:Delphi XE10.1 引用计数(Delphi XE10.1 Berlin终于增加了对接口的Weak, UnSafe的支持)
文章链接:http://soscw.com/index.php/essay/49665.html