- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我研究过ARC下的内存管理但我仍然不确定在这种情况下会发生什么
function foo() : boolean
var
Mycon : TMyConnection
MyQuery : TMyQuery
begin
Mycon := TMyConnection.Create(nil);
Mycon.ConnectString := MyConnection1.ConnectString;
Mycon.ConnectionTimeout:= 3;
MyQuery := TMyQuery.Create(nil);
MyQuery.Connection := Mycon;
Mycon.Connect;
//Do a few Queries
end;
现在传统上来说,我会调用 Free 来释放它们,但我知道 ARC 使用引用计数来释放对象,一旦对象超出范围,就会被释放,在本例中,它是在查询之后被释放的。
现在我的问题是:TMyConnection 的事件连接会将对象保留在范围内吗?
我知道我总是可以将 Mycon 分配给 NIL 或调用 DisposeOf 来破坏任何引用。
最佳答案
I know ARC uses reference counting to free objects, And a object is freed once it goes out of scope
更准确地说,当它的引用计数降至 0 时,它就会被释放。差别很大,因为如果仍有其他事件引用,则变量可能会超出范围而对象本身不会被释放。
Would the active connection of the TMyConnection keep the object in scope?
这取决于几个因素:
是否TMyQuery.Connection
属性使用强或弱引用 TMyConnection
对象(即,支持其 TMyQuery
属性的 Connection
字段是否具有 [weak]
属性)。
是否TMyQuery.Connection
属性(property)设置者来电FreeNotification()
关于TMyConnection
对象。
让我们看看最好的情况 - 弱引用并且没有 FreeNotification()
:
type
TMyConnection = class(...)
//...
end;
TMyQuery = class(...)
private
[weak] FConn: TMyConnection;
published
property Connection: TMyConnection read FConn write FConn;
end;
function foo() : boolean
var
Mycon : TMyConnection
MyQuery : TMyQuery
begin
Mycon := TMyConnection.Create(nil); // <-- MyCon.RefCnt is now 1
Mycon.ConnectString := MyConnection1.ConnectString;
Mycon.ConnectionTimeout:= 3;
MyQuery := TMyQuery.Create(nil); // <-- MyQuery.RefCnt is now 1
MyQuery.Connection := Mycon; // <-- MyCon.RefCnt remains 1
Mycon.Connect;
*Do a few Queries*
end; // <-- MyCon.RefCnt drops to 0, MyQuery.RefCnt drops to 0, OK!
在这种情况下,由于 TMyQuery
对象对 TMyConnection
具有弱引用对象,TMyConnection
的引用计数不会增加。因此,当 MyCon
时,两个对象引用计数都降至 0。和MyQuery
变量超出范围,两个对象都被释放。
现在让我们看看最坏的情况 - 强引用和 FreeNotification()
。如果您将组件从 ARC 之前的版本迁移到基于 ARC 的系统而不重新编写它们来处理 ARC,您可能会遇到以下情况:
type
TMyConnection = class(...)
//...
end;
TMyQuery = class(...)
private
FConn: TMyConnection;
procedure SetConnection(AValue: TMyConnection);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
published
property Connection: TMyConnection read FConn write SetConnection;
end;
procedure TMyQuery.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FConn) then
FConn := nil;
end;
procedure TMyQuery.SetConnection(AValue: TMyConnection);
begin
if FConn <> AValue then
begin
if FConn <> nil then FConn.RemoveFreeNotification(Self);
FConn := AValue;
if FConn <> nil then FConn.FreeNotification(Self);
end;
end;
function foo() : boolean
var
Mycon : TMyConnection
MyQuery : TMyQuery
begin
Mycon := TMyConnection.Create(nil); // <-- MyCon.RefCnt is now 1
Mycon.ConnectString := MyConnection1.ConnectString;
Mycon.ConnectionTimeout:= 3;
MyQuery := TMyQuery.Create(nil); // <-- MyQuery.RefCnt is now 1
MyQuery.Connection := Mycon; // <-- MyCon.RefCnt is now 3, MyQuery.RefCnt is now 2
Mycon.Connect;
*Do a few Queries*
end; // <-- MyCon.RefCnt drops to 2, MyQuery.RefCnt drops to 1, LEAKS!
在这种情况下,由于 TMyQuery
对象有 2 个对 TMyConnection
的强引用对象(1 表示支持 Connection
属性的字段,1 在其 FreeNotification()
列表中),以及 TMyConnection
对 TMyQuery
有强烈引用(在其 FreeNotification()
列表中),当 MyCon
时,两个对象引用计数都会递增并且不会降至 0。和MyQuery
变量超出范围,因此两个对象都被泄漏。
为什么 FreeNotification()
列表有强引用吗?因为在XE3中,Embarcadero改变了TComponent.FFreeNotifies
来自 TList
的成员到 TList<TComponent>
。现在已经键入了列表中的指针,并且无法标记 TList<T>
当 T
时持有弱指针源自TObject
,所以他们使用强引用。这是 Embarcadero 尚未解决的已知问题,因为 XE8 仍在使用 TList<TComponent>
而不是回到TList
或者至少切换到TList<Pointer>
.
有关更多详细信息,请参阅此问题的答案:
How to free a component in Android / iOS
I know I could always just assign Mycon to NIL or call DisposeOf to break any refrences.
设置MyCon
to nil 只会释放该特定引用,但不会对其他引用产生任何影响,例如 TMyQuery.Connection
。调用MyCon.DisposeOf()
另一方面,会释放对象并将所有强引用保留在非零 Disposed
中。状态。
但是,在这种情况下,您应该能够清除 MyQuery.Connection
属性,使其有机会释放对 TMyConnection
的任何强引用。目的。这适用于上述两种情况:
// weak referencing, no FreeNotifcation():
function foo() : boolean
var
Mycon : TMyConnection
MyQuery : TMyQuery
begin
Mycon := TMyConnection.Create(nil); // <-- MyCon.RefCnt is now 1
Mycon.ConnectString := MyConnection1.ConnectString;
Mycon.ConnectionTimeout:= 3;
MyQuery := TMyQuery.Create(nil); // <-- MyQuery.RefCnt is now 1
MyQuery.Connection := Mycon; // <-- MyCon.RefCnt remains 1, MyQuery.RefCnt remains 1
try
Mycon.Connect;
*Do a few Queries*
finally
MyQuery.Connection := nil; // <-- MyCon.RefCnt remains 1, MyQuery.RefCnt remains 1
end;
end; // <-- MyCon.RefCnt drops to 0, MyQuery.RefCnt drops to 0, OK!
// strong reference, FreeNotification():
function foo() : boolean
var
Mycon : TMyConnection
MyQuery : TMyQuery
begin
Mycon := TMyConnection.Create(nil); // <-- MyCon.RefCnt is now 1
Mycon.ConnectString := MyConnection1.ConnectString;
Mycon.ConnectionTimeout:= 3;
MyQuery := TMyQuery.Create(nil); // <-- MyQuery.RefCnt is now 1
MyQuery.Connection := Mycon; // <-- MyCon.RefCnt is now 3, MyQuery.RefCnt is now 2
try
Mycon.Connect;
*Do a few Queries*
finally
MyQuery.Connection := nil; // <-- MyCon.RefCnt drops to 1, MyQuery.RefCnt drops to 1
end;
end; // <-- MyCon.RefCnt drops to 0, MyQuery.RefCnt drops to 0, OK!
关于delphi - ARC下数据库连接对象(Mydac TMyConnection)会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010583/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!