FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Problema con Interfaces
Buenas compañeros,
Tengo un pequeto problema con las interfaces en Delphi 7/XE, aver si me pudieras echar una mano ya que no sé el porque puede estar pasando. Tengo declarada una interface definida tal que así:
Tengo varias clases que implementan este interface tal que asi:
Hasta aqui todo bien, con su teoria y todo. Bien, pues me he creado un controler el cual dependiendo de la ocasión utilizará un interface o otro. El controller en resumidas cuentas es tal que así:
Hasta aqui creo que actuo correctamente. Y es resumidas cuentas se hace esto, pongamos en un botón;
El problema es que al restablecer el interface 1 me salta una Excepcion: ... EAccessViolation with the Message 'Access violation at Adress XXXXXX'... ¿Que estoy haciendo mal? En ningun momento libero los objetos ejemplo1, ejemplo2. Es más en debbug compruebo que tiene valor, pero al igualarlo a la variable interface es donde salta. He estado mirando ejemplos y demás y no veo ninguno en el cual utilice los interfaces de esta manera. ¿Puede ser que le este dando un mal uso a los interface en Delphi? Muchas gracias por adelantado. |
#2
|
|||
|
|||
Hola,
El problema es que los objetos que implementan interfaces llevan un conteo del nº de referencias que apuntan a ellos (mira en detalle la implementación de TInterfacedObject, los métodos _AddRef y _Release). Cuando el nº de referencias es 0, entonces se autodestruyen. Cuando asignas self.interface:=ejemplo1, entonces ejemplo1.RefCount vale 1. Cuando asignas self.interface:=ejemplo2, entonces ejemplo1.RefCount pasa a valer 0, autodestruyéndote ejemplo1. Cuando vuelves a asignar self.interface:=ejemplo1, entonces ejemplo2.RefCount pasa a valer 0, autodestruyéndote ejemplo2, y interface pasa a referenciar a un sitio en el que no hay nada (se autodestruyó anteriormente) y de ahi la excepción. Para el ejemplo que estás dando, yo usaría lo mismo, pero en lugar de derivar interfaces, derivaría de una clase común, del estilo: TClasePadre=class procedure proX; virtual; abstract; end; y tu puntero en lugar de ser de tipo IEjemplo, sería de tipo TClasePadre. Un saludo, LoPiTaL |
#3
|
||||
|
||||
Toda la razón LoPiTaL!
Lo que me ha llamado la atención es que si hacia: controlerE.establecerInterface(1); controlerE.establecerInterface(2); controlerE.establecerInterface(1); Saltaba la excepción. Pero si lo hacia al reves: controlerE.establecerInterface(2); controlerE.establecerInterface(1); controlerE.establecerInterface(2); No! ¿Por que?....Porque ejemplo2 tenia variables dentro y ejemplo1 no. Por lo cual interpreto con tu explicación que al existir una reserva de memoria del objeto no se libera como bien dices. Seguire tu consejo o con el case que tenia preparado. De vez en cuando por intentar optimizar código la que te buscas . Muchas gracias! |
#4
|
|||
|
|||
Cita:
Si tienes ganas, prueba a usar FastMM con la opción para detectar lectura de interfaces liberadas, y verás como sí te detecta un problema (saltará una excepción). O más sencillo, prueba a hacer, tras establecer la interfaz 2 por 2ª vez, a llamar al método proX ese. Y te dará error o devolverá datos que no son coherentes. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problema con las interfaces gráficas | skatevil | Gráficos | 4 | 04-02-2008 16:55:52 |
interfaces | luislat40 | Varios | 2 | 23-10-2007 03:47:23 |
Interfaces... | OscarG | OOP | 9 | 14-10-2005 13:26:57 |
Interfaces de XML | vhr | Providers | 2 | 26-08-2005 17:22:06 |
Interfaces | Legolas | Varios | 14 | 17-11-2003 14:39:07 |
|