2011-08-29 12 views
9

Supponiamo di avere una classe myClass < handle. Da Mathworks Help page on clear,MATLAB - esegui il distruttore di oggetti quando usi 'clear'?

La cancellazione degli handle di handle di grafica non rimuove gli oggetti stessi, né elimina gli oggetti rimuovendo le variabili che memorizzano le loro maniglie.

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 

Così clear ing un oggetto maniglia non rimuove dalla memoria a meno che non esplicitamente delete per primo ..

ho specificato un distruttore per myClass di fare una corretta pulizia e rimuovere alcuni riferimenti ad esso; questo distruttore non viene chiamato su clear. È possibile chiamare quel distruttore quando il mio oggetto è cancellato?

EDIT: Devo dire che, mentre delete si chiama automaticamente con un clear se non ci sono riferimenti all'oggetto myClass, ho un'altra classe, dire myOtherClass con proprietà che si riferiscono a myClass, diciamo myOtherClass.a. Esistono inoltre altre proprietà in myOtherClass che non sono proprietà di myClass, ma dovrebbero essere vuote se anche myOtherClass.a è vuoto. Fammi sapere se questo non ha senso, potrebbe essere stato un po 'troppo verboso.

risposta

10

Cancellando tutti i riferimenti a un oggetto di classe handle lo rimuoverà dalla memoria e il metodo delete sul tuo myClass verrà richiamato automaticamente sull'oggetto da distruggere. È solo una sfortunata terminologia confusionaria. Il tuo myClass è una "classe MCOS" o "oggetto MCOS", non un "oggetto grafico di handle" come sta parlando di help clear. Sono cose diverse, almeno a livello di codice M.

La grafica maniglia "oggetti" non sono lo stesso tipo di "oggetto" che il vostro myClass è, e il "manico Handle Graphics" restituito da figure() non è la stessa cosa come la classe denominata handle che sei ereditando da Il passaggio da help clear che parla di "handle handle handle" non si applica al tuo oggetto. Vedere doc handle e seguire il collegamento per il metodo delete per la documentazione pertinente.

Non sentirti male; il Matlab doco non rende queste distinzioni molto chiare. (IIRC non usa nemmeno esplicitamente il termine "MCOS", semplicemente li chiama "oggetti"). Fondamentalmente, il materiale nella sezione "Programmazione orientata agli oggetti" nella doco è rilevante per il tipo di "oggetto" e "gestisci" con cui stai lavorando con myClass. Il documento sotto "Grafica" e "Sviluppo GUI" sta parlando dell'altro tipo di grafica di "oggetto" e "maniglia". Penso che usino il termine "handle" per la grafica della maniglia e "handle class" per le cose OOP.

Per verificare che il proprio delete funzioni, è sufficiente effettuare una semplice lezione.

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

E quindi crearne uno e cancellarlo.

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

Se il distruttore non viene chiamato, potrebbero sussistere altri riferimenti all'oggetto. Il distruttore non viene chiamato ogni volta che viene cancellata una variabile contenente un riferimento all'oggetto, solo quando viene cancellata l'ultima variabile contenente un riferimento (o riferimento indiretto).

+0

Esistono sicuramente altri riferimenti all'oggetto persistente; parte del motivo per cui vorrei che questa funzionalità fosse perché mi sbarazzavo di quei riferimenti nel mio distruttore. Ho aggiornato il PO con le informazioni pertinenti; potrebbe non avere senso senza il contesto completo, ma il contesto completo non è rilevante per la domanda in particolare. –

+0

Ho avuto problemi simili, specialmente quando creavo elementi personalizzati della GUI. Non penso sia possibile forzare la chiamata del distruttore quando si cancella la variabile. Come si nota nella tua domanda, potresti voler semplicemente chiamare il metodo delete sul tuo oggetto prima di cancellarlo. – hoogamaphone

+0

Solo per FYI, penso che sia una buona funzionalità che il distruttore non sia chiamato con clear sia usato nel terminale quando si usa una GUI con codice orientato agli oggetti (che ho trovato per lo più nel caso). Ciò significa che se l'utente usa 'clear' per sbaglio, il tuo gui non si spegne, anche se l'handle del gui viene cancellato dallo spazio di lavoro. Tuttavia, se l'utente chiama 'delete' sul manico, il distruttore verrà comunque eseguito. – Justin

Problemi correlati