网站手机端页面怎么做的,合肥专业制作网站,软装设计师要学什么,公司官网怎么做的13.4.2 弱引用是系统托管的
弱引用的托管是一个非常重要的内容。换句话说#xff0c;系统会在内存中保存一个弱引用列表#xff0c;当对象被销毁时#xff0c;系统会检查是否有任何弱引用指向该对象#xff0c;如果有#xff0c;系统会将实际引用赋值为 nil#xff0…13.4.2 弱引用是系统托管的
弱引用的托管是一个非常重要的内容。换句话说系统会在内存中保存一个弱引用列表当对象被销毁时系统会检查是否有任何弱引用指向该对象如果有系统会将实际引用赋值为 nil即实际外部引用指针等于 nil。这意味着弱引用会产生运行时成本。
与传统的引用相比托管的弱引用的好处是可以检查接口引用是否仍然有效这意味着它所引用的对象已被销毁。但这也意味着在使用弱引用时应始终在使用前测试它是否已被赋值。
private[weak] MySimple: IMySimpleInterface; 还有一个按钮为该字段分配一个引用并使用它确保它仍然有效
procedure TForm3.BtnGetWeakClick(Sender: TObject);
varMyComplex: IMyComplexInterface;
beginMyComplex : TMyComplexClass.Create;MyComplex.GetSimple.DoSomething(False);MySimple : MyComplex.GetSimple;
end;procedure TForm3.BtnUseWeakClick(Sender: TObject);
beginif Assigned(MySimple) thenMySimple.DoSomething(False)elseLog(Nil weak reference);
end; 除非修改代码否则 if Assigned 测试将失败因为第一个按钮事件处理器会创建并立即释放对象这样弱引用就会变成 nil因为它现在无效。但由于弱引用是托管的编译器会帮助你跟踪它的真实状态与对象引用不同。
13.4.3 Unsafe属性
在某些非常特殊的情况下例如在创建实例时函数可能会返回一个引用计数为零的对象。在这种情况下为了避免编译器立即删除该对象在它有机会被赋值给变量之前这样它的引用计数就会增加到 1我们必须将该对象标记为不安全对象。
这意味着必须暂时忽略对象的引用计数以使代码安全。这种行为是通过使用新的特定属性 [Unsafe] 来实现的只有在非常特殊的情况下才需要使用这种特性。
语法如下:
pascalCopy codevar[Unsafe] Intf1: IInterface;[Result: Unsafe] function GetIntf: IInterface; 在通用库中实现构造模式如工厂模式时使用该属性是有意义的。 注解为了支持现在已废弃的ARC内存模型System单元使用了一个unsafe指令因为它无法在属性定义之前同一单元的稍后部分使用该属性。在该单元之外的任何代码中都不应该使用该指令而且现在也不再使用了你可以在 $IFDEF 指令中看到它。