假设我有一个对象,电子邮件,其中一个属性是名为EmailSkinner的对象。
EmailSkinner在class_initialize子例程中实例化,就像这样。
private sub class_initialize()
set EmailSkinner = new MyEmailSkinner
end sub
我必须在Email的class_terminate子例程中将EmailSkinner对象显式设置为空吗?
private sub class_terminate()
set EmailSkinner = nothing
end sub
或者当我将Email对象本身设置为空时会自动发生这种情况吗?
答案 0 :(得分:1)
这是一个有趣的问题。您的假设是正确的,当父类从内存中释放时,您在父类范围内实例化的任何对象都将被释放。
然而,与VBScript中的所有对象实例化(以及扩展Classic ASP)一样,使用Class_Terminate
事件显式释放对象没有任何问题。
请记住,"范围"在这里很重要。
如果在父类之外声明了EmailSkinner
对象引用(无论它是否在类中实例化),引用将保留,并且需要Class_Terminate()
强制释放对象引用
对象引用在类范围内声明。
Class ParentObject
Private _ChildObject
Private Sub Class_Initialize()
Set _Object = new ChildObject()
End Sub
End Class
对象引用在类范围之外声明(不推荐这种方法)。
Dim GlobalObject
Class ParentObject
Private Sub Class_Initialize()
Set GlobalObject = new ChildObject()
End Sub
'GlobalObject reference will remain so we need to
'force it to be released.
Private Sub Class_Terminate()
Set GlobalObject = Nothing
End Sub
End Class
答案 1 :(得分:1)
默认情况下,Class对象会被自动销毁,但如果在外部创建新对象,则需要从内存中释放它们。
始终建议我们在所有情况下清理内存。
我为你做了一小段代码测试(我希望这与你要解释的内容类似,因为你没有向我们展示你的代码)。
这段代码帮助我们检查一些执行和声明步骤后是否有东西留在内存中(只需取出底部的撇号来测试代码):
Class EmailSkinner
public color
public size
Private Sub Class_Initialize
color = "blue"
size = 300
End Sub
End Class
Class Email
public details
public name
Private Sub Class_Initialize
Set details = New EmailSkinner '//Module Scope
End Sub
Private Sub Class_Terminate
Set details = Nothing
End Sub
End Class
Set email1 = New Email '//Global Scope
With email1
.details.color = "black"
.details.size = 400
End With
''//Take out the apostrophe to test one of the next lines
'Response.Write email1.details.color '//ASP only
'wscript.echo email1.details.color '//Wscript only
Set email1 = Nothing