Cita:
|
Empezado por yusnerqui
A no ser que uses interfaces, pues estas lo hacen por si sola, esto es cierto verdad???
|
No exactamente. Cada vez que se agrega una referencia a una interfaz (cualquier variable a la que le asignes una interfaz), el compilador agrega una llamada al método _AddRef, y cada vez que se pierde una referencia (por ejemplo, cuando una variable que tenía asignada una interfaz sale de alcance o cuando le asignas otra cosa) el compilador agrega una llamada a _Release.
Aunque semánticamente _AddRef y _Release parecen agregar una referencia y quitarla, lo cierto es que no hacen nada por sí solas, porque, de hecho no existen.
Como sabrás, una interfaz no implementa nada por si sola, sino que se limita a a definir un conjunto de métodos. Una clase puede implementar una o más interfaces, y será esa clase entonces quien realmente haga la implementación de los métodos.
La interfaz base, IInterface, declara tres métodos: QueryInterface, _AddRef y _Release.
Cuando se trabaja con interfaces, se suele derivar la clase que las implemente de TInterfacedObject, que es un objeto que implementa los métodos de IInterface, de manera que nosotros no tengamos que preocuparnos por hacerlo.
TInterfacedObject es quien realmente implementa el manejo automático de la destrucción. Para ello lleva un campo interno FRefCount, que incremente en 1 cada vez que se llama a _AddRef y lo decrementa en 1 cada vez que se llama a _Release. Cuando el método _Release deeca que _RefCount llega a cero, entonces se "suicida".
Sin embargo, puedes usar otros objetos base o implementar tú mismo _AddRef y _Release, de manera que no destrutan el objeto.
// Saludos