Delphi 在悉尼,在一个物体前设置[弱]是否构成处罚?
在delphi sydney中,在对象(而不是接口)前面设置[弱]是否会造成惩罚? 例如:Delphi 在悉尼,在一个物体前设置[弱]是否构成处罚?,delphi,firemonkey,Delphi,Firemonkey,在delphi sydney中,在对象(而不是接口)前面设置[弱]是否会造成惩罚? 例如: TMyObject = class(Tobject) Private [weak] FOwner: TMyObject; .... end; 我这样问是因为我知道内部[弱]引用存储在一个列表中,因此它有一些缺点(关于速度)。随着Sydney ARC的消失,不再需要在对象前面放置[weak](据我所知),但由于我想保持代码与Rio兼容,因此我问我是否可以安全地离开[weak]引
TMyObject = class(Tobject)
Private
[weak] FOwner: TMyObject;
....
end;
我这样问是因为我知道内部[弱]引用存储在一个列表中,因此它有一些缺点(关于速度)。随着Sydney ARC的消失,不再需要在对象前面放置[weak](据我所知),但由于我想保持代码与Rio兼容,因此我问我是否可以安全地离开[weak]引用而不损失无用的性能(在Sydney)
[弱]属性有一个很小的问题。它表示一个
零化弱引用,当对象被删除时,该弱引用将被零化(零)
指向的点不再有效。为了做到这一点,编译器必须
在运行时跟踪这些对象,这会带来一些开销。如果
您正在跟踪许多这样的引用,这些引用可能会引入
显著的性能损失
[weak]
对象引用的属性仅在ARC编译器上实现。在classic上,非ARC编译器[weak]
属性在对象引用上使用时没有任何作用,也没有任何惩罚
由于10.4 Sydney不再具有ARC编译器,[weak]
属性不再需要,但它可以用于维护向后兼容性。它不会影响使用非ARC编译器编译的代码
可以通过CPU视图轻松检查[weak]
对非ARC编译器没有影响
var
Obj: TObject;
[weak] WObj: TObject;
begin
Obj := TObject.Create;
WObj := Obj;
Obj.Free;
end;
在Android ARC编译器10.3上,将Obj
分配给弱WObj
将调用\u instwakcopy
过程来跟踪弱引用:
使用10.4 Android编译器编译的相同代码不再调用\u InstWeakCopy
:
注意:此答案严格涵盖了在对象引用上使用
[weak]
属性时的行为。用于接口引用[weak]
的工作原理与以前相同,因为它是在10.1 Berlin的非ARC编译器中引入的。它根本不做任何事情。@StefanGlienke是否有任何来源来确认此行为?我做了一些测试,是的,看起来是真的,但更愿意100%确定你不相信我是这件事的最终真相来源?Pff;)里约热内卢有这一页:-悉尼文件不再有了[WEAKINSTREF
没有定义时,code>[WEAKINSTREF从来没有做过任何事情-fwiw页面不正确-因为AUTOREFCOUNT
和WEAKINSTREF
不应该再在任何平台上定义了。@StefanGlienke-ahah是的,我相信你,但你是……嗯,你是人类:)通常,@StefanGlienke的语句比docwiki上的语句更准确。当然,[weak]
仍然对接口引用有影响。(我想这篇文章的一些读者可能看不到,如果他们断章取义的话。)@AndreasRejbrand这就是为什么我把对象引用放在粗体的顶部。