2010-06-28 17 views
13

Ho una classe C++ oggettiva che contiene alcuni puntatori di oggetti C++ onesti.Destructor in Objective-C++

Quando la classe Obj-C++ viene distrutta chiama immediatamente dealloc? Se è così, allora è il modo migliore per distruggere la classe C++ mettendo

delete obj 

nel metodo dealloc?

risposta

23

Presumo che quando si dice "classe Obj-C++" si intenda una classe Objective-C che capita di contenere alcune classi C++.

Le classi Objective-C non chiamano dealloc quando vengono distrutte; sono distrutti avendo il messaggio dealloc inviato a loro.

Con quel po 'di pedanteria il modo, se il metodo init obj un'istanza allora, sì, chiamare delete obj nella dealloc:

-(void)dealloc { 
    delete obj; 
    [super dealloc]; 
} 
+3

ARC vieta di inviare un messaggio dealloc - non c'è bisogno di chiamare '[super dealloc]' quando si usa ARC come risposta [qui] (http://stackoverflow.com/questions/7292119/custom-dealloc-using-arc-objective -c) – benjineer

+0

@benjineer ARC non è stato ancora rilasciato quando è stata scritta questa risposta, ma hai ragione che '[super dealloc]' non è compatibile con ARC. –

7

Come supplemento alla risposta corretta di Frank Shearar, a condizione che si sta utilizzando il OSK 10.4 o successivo SDK (e probabilmente lo sono, anche se non sono sicuro del runtime di iPhone qui) puoi anche includere membri C++ di classi Objective-C, cioè senza ricorrere a un puntatore. Il problema nelle versioni precedenti dell'SDK OSX era che il costruttore e il distruttore del membro C++ non venivano richiamati. Tuttavia, specificando l'opzione del compilatore fobjc-call-cxx-cdtors (in XCode è esposto come l'impostazione GCC_OBJC_CALL_CXX_CDTORS), il ctor e il dtor verranno richiamati. Vedi anche Apple docs, un po 'giù per quella pagina.

+0

Funziona anche quando è necessario memorizzare un puntatore finché lo si avvolge, ad es. in un 'std :: unique_ptr' – Sebastian

Problemi correlati