ciclo de vida de un objeto

Iniciado por nuevopirata, 16 Enero 2008, 22:45 PM

0 Miembros y 1 Visitante están viendo este tema.

nuevopirata

hola buenas tardes a todos los que hacen posible este foro, mi pregunta es la siguiente: ¿que es ciclo vidal de un objeto? ¿interacciones entre tipo?

gracias por la ayuda prestada

foobar

#1
Los objetos viven desde que se crean hasta que se establecen a Nothing, o hasta que el programa finalice normalmente. En el caso de referencias circulares, teóricamente nunca se destruyen (a menos que el programa finalice).

Vamos a suponer que tenemos dos módulos de clase:


'
' CClasePadre
'
Private oChild As CClaseHijo

Function foo(sArg As String) As Boolean
  Debug.Print sArg

  foo = True
End Function

Property Get Child() As CClaseHijo
  Set Child = oChild
End Property

Private Sub Class_Initialize()
  '
  ' Constructor de la clase.
  ' Crea una instancia de la clase Hijo y
  ' se asigna a sí misma como Padre.
  '
  Set oChild = new CClaseHijo

  oChild.setParent(Me)
End Sub



'
' CClaseHijo
'
Private oParent As CClasePadre

Friend Sub setParent(oArg As Object) As Boolean
  Set oParent = oArg
End Function

Property Get Parent() As CClasePadre
  Set Parent = oParent
End Property


Ahora, vamos a hacer algunas pruebas:


Sub TestClass()
  Dim Padre As CClasePadre
  Dim Hijo   As CClaseHijo

  ' Crea el objeto Padre y la función constructora del
  ' mismo crea una instancia de Hijo (Class_Initialize)
  '
  Set Padre = New CClasePadre

  '
  ' Obtiene una referencia del hijo del objeto
  ' padre y la guarda en la variable local Hijo
  '
  Set Hijo = Padre.Child

  '
  ' En teoría debería destruir al objeto Padre, pero
  ' como Hijo tiene la propiedad Parent que hace referencia
  ' a nuestro objeto Padre, el objeto no se destruye, sólo
  ' esta instancia.
  '
  Set Padre = Nothing

  '
  ' Ahora en teoría, debería destruirse el objeto Hijo, pero como
  ' este tiene la propiedad Parent con el objeto Padre (que en teoría ya
  ' destruímos si no supiéramos que sigue activo en este lugar), y
  ' Parent (Padre) tiene la propiedad que hace referencia a Hijo,
  ' el objeto no se destruye, SÓLO la instancia guardada en Hijo
  '
  Set Hijo = Nothing
End Sub


Como verás, este es un claro ejemplo de referencias circulares. Lo que sucede cuando eliminamos TODAS nuestras instancias conocidas como hicimos con la variable Padre e Hijo, en memoria sigue existiendo al menos una instancia de cada una, e indestructibles porque cada una hace referencia a la otra.

Hay que tener mucho cuidado con esto a la hora de usar referencias circulares, y en todo caso si una clase se va a crear recursivamente evitar este tipo de prácticas porque podríamos ocupar grandes cantidades de memoria.

De todas formas, TODOS los objetos se destruyen -sí o sí- cuando el proceso se cierra, porque están guardados siempre en el espacio de direcciones de memoria de este proceso.

Saludos.

nuevopirata

gracias amigo por tu respueta tratare de comprender ya que soy nuevo en vb estoy viendo vb en este semestre, muchisimas gracias por tu ayuda dios te brinde el doble de lo que das.