vb(6)的class在卸载前会触发Terminate事件,于是可以将一些卸载前需要处理的代码放到这里来,在object卸载时自动执行,这样子看上去很美,可以偷懒了.可是在某些情况下会有很大问题,请看下面的两个类,Class1,Class2
'
==== Class1 ====
Option Explicit
Private m_cc As Class2
Public Sub Init() Sub Init(cc As Class2)
Set m_cc = cc
End Sub
Private Sub Class_Terminate()
Set m_cc = Nothing
End Sub
Option Explicit
Private m_cc As Class2
Public Sub Init() Sub Init(cc As Class2)
Set m_cc = cc
End Sub
Private Sub Class_Terminate()
Set m_cc = Nothing
End Sub
'
==== Class2 ====
Option Explicit
Private m_cc As Class1
Public Sub Init() Sub Init(cc As Class1)
Set m_cc = cc
End Sub
Private Sub Class_Terminate()
Set m_cc = Nothing
End Sub
Option Explicit
Private m_cc As Class1
Public Sub Init() Sub Init(cc As Class1)
Set m_cc = cc
End Sub
Private Sub Class_Terminate()
Set m_cc = Nothing
End Sub
两个类都有一个成员变量m_cc,类型分别是另一个Class,如果这样使用
dim
c1
as
Class1 , c2
as
Class2
set c1 = new Class1
set c2 = new Class2
c1.Init c2
c2.Init c1
set c1 = new Class1
set c2 = new Class2
c1.Init c2
c2.Init c1
这样一来,即使将c1,c2都置为Nothing,对象都不会被卸载,因为各自的m_CC都有对另一个对象的引用,从而也不会触发Terminate事件.另外,事实上在Terminate中才将 m_cc置为Nothing 是没什么意义的,当该对象卸载后,它的成员变量也自然会被释放.当然这个例子有点极端,一般不会这样子用,但有些时候可能在不知不觉中就出现了这种状况,另外有些时候触发Terminate事件会比预期的时间晚了,从而也会存在问题,所以为了避免出现上面的情况,最好是在卸载前主动的处理卸载前需要做的事情,而不要完全依赖于vb的回收系统(是这么叫吧?大家都应该明白的啦),于是大概代码改为,
====
Class1
====
Option Explicit
Private m_cc As Class2
Public Sub Init() Sub Init(cc As Class2)
Set m_cc = cc
End Sub
Private Sub Class_Terminate()
Call ReleaseMe
End Sub
Private Sub ReleaseMe()
Set m_cc = Nothing
End Sub
Option Explicit
Private m_cc As Class2
Public Sub Init() Sub Init(cc As Class2)
Set m_cc = cc
End Sub
Private Sub Class_Terminate()
Call ReleaseMe
End Sub
Private Sub ReleaseMe()
Set m_cc = Nothing
End Sub
准备卸载前调用一下ReleaseMe,这样就好很多了.
by lingll
http://blog.csdn.net/lingll/
lingll_xl@163.com
2006-12-4