Иван FXS |
Бабай "не только классы ... не будут разрушены" - классы? Или объекты – экземпляры классов??
|
объекты – экземпляры классов
Иван FXS |
Если экземпляры, то – дополнительный вопрос на понимание: "не будут разрушены" – в смысле "останутся в памяти" (в виде мусора)?
|
"не будут разрушены" – в смысле "останутся в памяти"
на остальное отвечу так:
пусть у вас есть тестовый класс Class1
Option Compare Database
Option Explicit
Private parentObj As Object
Private Sub Class_Initialize()
Debug.Print "Initialize:" & ObjPtr(Me)
End Sub
Private Sub Class_Terminate()
Debug.Print "Terminate:" & ObjPtr(Me)
End Sub
Property Set setParent(ByVal pObj As Object)
Set parentObj = pObj
End Property
Property Get getParent() As Object
Set getParent = parentObj
End Property
поэкспериментируйте с ним.
например так (стандартный модуль):
Dim pC As Class1
Sub simpleTEst()
Dim obj1 As Class1
Dim obj2 As Class1
Set obj1 = New Class1
Set obj2 = New Class1
Set obj2.setParent = obj1 ' объект2 ссылается на объект 1. В этой точке циклической ссылки еще нет.
Set obj1.setParent = obj2 ' завершение циклической ссылки - теберь эта пара будет вечной
End Sub
Sub Test()
Dim pObj As Class1
Dim tC As Collection
Set pObj = New Class1
'следующая строка нужна для того, чтобы зацепиться за коллекцию впоследствии.
'если ее выключить из исполнения - окончательно потеряются следы объектов
'но сами объекты останутся в памяти
Set pC = pObj
Set tC = New Collection
tC.Add pObj, "K1"
Set pObj.setParent = tC 'это организация циклической ссылки.
' TC содержит ссылку на pObj, а pObj ссылку на TC
Set pObj = New Class1
tC.Add pObj, "K2"
Set pObj.setParent = tC
Set tC = Nothing
'если PC сформирован, то
'добраться до коллекции впоследствии можно
'запустите Sub2
End Sub
Sub sub2()
Dim mC As Collection
If Not pC Is Nothing Then
Set mC = pC.getParent
If Not mC Is Nothing Then
Debug.Print mC.Count
End If
End If
End Sub