Weak References

本文详细介绍了弱引用的概念及其在Delphi Mobile编译器中的角色,通过实例展示了如何使用弱引用解决循环引用问题,确保程序资源的有效管理和内存的合理利用。

http://docwiki.embarcadero.com/RADStudio/Seattle/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers#Weak_References

Weak References

Another important concept for ARC is the role of weak references, which you can create by tagging them with [weak] attribute. Suppose that two objects refer to each other using a field, and an external variable refers to the first. The reference count of the first object will be 2 (the external variable, and the second object), while the reference count of the second object is 1. Now, as the external variable goes out of scope, the two objects' reference count remains 1, and they remain in memory indefinitely.

To solve this type of situation, and many similar scenarios, is to use a weak reference to break the circular references when the last external reference goes out of scope.

A weak reference is a reference to an object that does not increase its reference count. To declare a weak reference, use the [weak] attribute, supported by the Delphi mobile compilers.

Given the previous scenario, if the reference from the second object back to the first one is weak, as the external variable goes out of scope, both objects are destroyed. Here is an example of this situation:

type
  TMyComplexClass = class;
 
  TMySimpleClass = class private [Weak] FOwnedBy: TMyComplexClass; public constructor Create(); destructor Destroy (); override; procedure DoSomething(bRaise: Boolean = False); end;   TMyComplexClass = class private fSimple: TMySimpleClass; public constructor Create(); destructor Destroy (); override; class procedure CreateOnly; end;

In the following code snippet, the constructor of the complex class creates an object of the other class:

constructor TMyComplexClass.Create;
begin
  inherited Create; FSimple := TMySimpleClass.Create; FSimple.FOwnedBy := self; end;

Remember that the FOwnedBy field is a weak reference, so it does not increase the reference count of the object it refers to, in this case the current object (self).

Given this class structure, we can write:

class procedure TMyComplexClass.CreateOnly;
var MyComplex: TMyComplexClass; begin MyComplex := TMyComplexClass.Create; MyComplex.fSimple.DoSomething; end;

This causes no memory leak, given that the weak reference is properly used.

As a further example of the use of weak references, note this code snippet in the Delphi RTL, part of the TComponent class declaration:

type
  TComponent = class(TPersistent, IInterface, IInterfaceComponentReference) private [Weak] FOwner: TComponent;

If you use the weak attribute in code compiled by one of the desktop Delphi compilers, the attribute is ignored. Using DCC32, you have to make sure that you add the proper code in the destructor of an "owner" object to also free the "owned" object. Calling Free is allowed, although the effect is different in the Delphi mobile compilers. The behavior is correct in both in most circumstances.

Note: When an instance has its memory released, all active [weak] references are set to nil. Just as a strong (normal) reference, a [weak] variable can only be nil or reference a valid instance. This is the main reason why a weak reference should be assigned to a strong reference before being tested for nil and dereferenced. Assigning to a strong reference does not allow the instance to be released prematurely.
var
  O: TComponent;// a strong reference
begin
  O := FOwner; // assigning a weak reference to a strong reference if O <> nil then O.<method>;// safe to dereference end;
Note: You can only pass a [Weak] variable to a var or out parameter that is also marked as [Weak]. You cannot pass a regular strong reference to a [Weak] var or out parameter.
07-01 11:39:13.217 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '<empty> and /system_ext/priv-app/SystemUI/SystemUI.apk' with 1 weak references 07-01 11:39:13.219 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '/product/overlay/SystemUIResCommon_Sys.apk' with 1 weak references 07-01 11:39:13.220 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '<empty> and /system_ext/app/LogKit/LogKit.apk' with 1 weak references 07-01 11:39:13.221 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~g60U6kk2l6LGwajwPYLwyg==/com.google.android.apps.maps-y_k7LC-SmhOgp-FJsvzemQ==/base.apk' with 1 weak references 07-01 11:39:13.221 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~g60U6kk2l6LGwajwPYLwyg==/com.google.android.apps.maps-y_k7LC-SmhOgp-FJsvzemQ==/split_config.arm64_v8a.apk' with 1 weak references 07-01 11:39:13.221 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~g60U6kk2l6LGwajwPYLwyg==/com.google.android.apps.maps-y_k7LC-SmhOgp-FJsvzemQ==/split_config.en.apk' with 1 weak references 07-01 11:39:13.222 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~g60U6kk2l6LGwajwPYLwyg==/com.google.android.apps.maps-y_k7LC-SmhOgp-FJsvzemQ==/split_config.in.apk' with 1 weak references 07-01 11:39:13.222 26474 26487 W .statistics.rom: ApkAssets: Deleting an ApkAssets object '<empty> and /data/app/~~g60U6kk2l6LGwajwPYLwyg==/com.google.android.apps.maps-y_k7LC-SmhOgp-FJsvzemQ==/split_config.xxhdpi.apk' with 1 weak references解析日志
07-17
标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值