Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在悉尼,在一个物体前设置[弱]是否构成处罚?_Delphi_Firemonkey - Fatal编程技术网

Delphi 在悉尼,在一个物体前设置[弱]是否构成处罚?

Delphi 在悉尼,在一个物体前设置[弱]是否构成处罚?,delphi,firemonkey,Delphi,Firemonkey,在delphi sydney中,在对象(而不是接口)前面设置[弱]是否会造成惩罚? 例如: TMyObject = class(Tobject) Private [weak] FOwner: TMyObject; .... end; 我这样问是因为我知道内部[弱]引用存储在一个列表中,因此它有一些缺点(关于速度)。随着Sydney ARC的消失,不再需要在对象前面放置[weak](据我所知),但由于我想保持代码与Rio兼容,因此我问我是否可以安全地离开[weak]引

在delphi sydney中,在对象(而不是接口)前面设置[弱]是否会造成惩罚? 例如:

  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这就是为什么我把对象引用放在粗体的顶部。