2011-08-29 10 views
9

Supongamos que tengo una clase myClass < handle. Desde el Mathworks Help page on clear, tratamiento de gráficos mangoMATLAB - ¿ejecuta el destructor de objetos cuando usa 'borrar'?

de compensación no elimina los objetos mismos, ni tampoco la eliminación de los objetos eliminan las variables que almacenan sus asas.

hf = figure; % Creates figure object, stores handle in variable hf 
delete(hf) % Removes figure object, but not the variable hf 
clear hf  % Removes hf from the workspace; figure could still exist 

Así clear ing un objeto mango no lo elimina de la memoria a menos que explícitamente se delete primera ..

he especificado un destructor para myClass hacer la limpieza adecuada y eliminar algunas referencias a ella; este destructor no se llama al clear. ¿Es posible llamar a ese destructor cuando mi objeto está despejado?

EDIT: Debo mencionar que, si bien delete es llamado automáticamente con un clear si no hay referencias al objeto myClass, tengo otra clase, por ejemplo myOtherClass con propiedades que hacen referencia a myClass, decir myOtherClass.a. También hay otras propiedades en myOtherClass que no son propiedades de myClass, pero deben estar vacías si myOtherClass.a también está vacío. Avíseme si eso no tiene sentido, eso podría haber sido demasiado prolijo.

Respuesta

10

Al borrar todas las referencias a un objeto de clase de manejador, se eliminará de la memoria y se llamará automáticamente al método delete en su myClass sobre el objeto que se destruye. Es solo una terminología confusa y desafortunada. Su myClass es una "clase MCOS" u "objeto MCOS", no se trata de un "objeto gráfico de manejo" como help clear. Son cosas diferentes, al menos en el nivel de código M.

el mango gráficos "objetos" no son el mismo tipo de "objeto" que su miclase, y el "manejan gráficos manejan" devuelto por figure() no es el mismo tipo de cosas como la clase nombrada handle que eres heredando de. Ese pasaje de help clear que habla de "manejar controladores de gráficos" no se aplica a su objeto. Consulte doc handle y siga el enlace para el método delete para doco relevante.

No te sientas mal; el doco Matlab no hace estas distinciones muy claras. (IIRC ni siquiera usa explícitamente el término "MCOS", simplemente los llama "objetos".) Básicamente, el material de la sección "Programación orientada a objetos" del doco es relevante para el tipo de "objeto" y "handle" en el que está trabajando con myClass. El doco en "Gráficos" y "Desarrollo de GUI" está hablando de los otros tipos de gráficos de tipo "objeto" y "manejar". Creo que utilizan el término "manejar" para manejar cosas de gráficos y "manejar clases" para las cosas OOP.

Para verificar que su delete funciona, solo haga una clase trivial.

classdef myClass < handle 
    methods 
     function delete(obj) 
     disp('delete was called'); 
     end 
    end 
end 

Y a continuación, cree una y despejándola.

>> x = myClass 
x = 
    myClass handle with no properties. 
    Methods, Events, Superclasses 
>> clear x 
delete was called 
>> 

Si no se está llamando a su destructor, puede haber otras referencias al objeto persistente. El destructor no recibe llamadas cada vez que se borra una variable que contiene una referencia al objeto, solo cuando se borra la última variable que contiene una referencia (o referencia indirecta).

+0

Ciertamente hay otras referencias al objeto persistente; Parte de la razón por la que me gustaría esta funcionalidad es porque me deshago de esas referencias en mi destructor. Actualicé el OP con la información relevante; podría no tener sentido sin el contexto completo, pero el contexto completo no es relevante para la pregunta en particular. –

+0

Tuve problemas similares, especialmente al crear elementos personalizados de la GUI. No creo que sea posible obligar al destructor a ser llamado cuando borre la variable. Como nota en su pregunta, es posible que desee simplemente llamar al método de eliminación en su objeto antes de borrarlo. – hoogamaphone

+0

Solo para su información, creo que es una buena funcionalidad que el destructor no se llame con clear se usa en el terminal cuando se usa una interfaz gráfica con código orientado a objetos (que en su mayoría he encontrado que es el caso). Esto significa que si el usuario usa 'clear' por accidente, su interfaz gráfica de usuario no se apagará, incluso si el controlador de la GUI se borra del área de trabajo. Sin embargo, si el usuario llama a 'delete' en el manejador, el destructor seguirá ejecutándose. – Justin

Cuestiones relacionadas