2009-04-07 7 views
7

Penso di conoscere la differenza, ma non so come spiegarlo correttamente.Che cosa spiega meglio la differenza tra [myVar dealloc] e [myVar release]?

dealloc rimuove totalmente e immediatamente la memoria riservata da tale variabile.

release decrementa il contatore di mantenimento della memoria di quella variabile di -1. se era 1, allora è 0, quindi avrebbe lo stesso effetto di dealloc in quel momento.

è giusto? o c'è una spiegazione breve migliore?

risposta

13

Esattamente.

Ma non utilizzare dealloc, quando si utilizza un oggetto, perché non si conosce il numero di conservazione. Né ti importa. Dici solo che non ne hai più bisogno, chiamando lo release. E quando nessuno lo fa, l'oggetto chiamerà lo dealloc su se stesso.

7

Tutto corretto, ma l'unico punto chiave che ti manca è che non dovresti mai chiamare dealloc tu stesso. Ecco alcune informazioni dalla documentazione di Apple sul metodo dealloc di NSObject:

(da http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/dealloc)

di non inviare un messaggio dealloc direttamente. Invece, il metodo dealloc di un oggetto viene richiamato indirettamente tramite tramite il metodo di protocollo NSObject versione (se il messaggio di rilascio restituisce il conteggio di mantenimento del destinatario diventando 0). Vedere Programmazione gestione memoria Guida per Cocoa per ulteriori dettagli su l'uso di questi metodi.

sottoclassi devono implementare le proprie versioni di dealloc per consentire l' rilascio di qualsiasi memoria aggiuntiva consumata dall'oggetto, ad esempio archiviazione allocato dinamicamente per i dati o variabili oggetto istanza di proprietà l'oggetto deallocato. Dopo eseguire la specifica classe deallocazione, il metodo della sottoclasse dovrebbe incorporare versioni superclasse di dealloc attraverso un messaggio a super:

+0

grazie. Penso di essere un po 'confuso ora ... quindi all'interno dei metodi dealloc delle sottoclassi, devo dealloc le mie variabili di istanza, giusto? ie - (void) dealloc { \t [dealloc gialloController]; \t [dealloc bluController]; [super dealloc]; } – Thanks

+0

Giusto per essere chiari, non chiamare mai dealloc su nulla tranne super. La corretta implementazione del metodo dealloc di Thanks è: - (void) dealloc {[yellowViewController release]; [versione blueViewController]; [super dealloc]; } – rpetrich

+0

Vedo che stai leggendo lo sviluppo di iPhone 3 iniziale - Esplorando l'SDK (anche io ho riconosciuto il progetto del controller di visualizzazione giallo/blu). – mk12