Mi sto lentamente insegnando cacao per l'iPhone (attraverso il Stanford Class on iTunes U) e ho appena passato la parte sulla gestione della memoria, e volevo sperare di ottenere qualche conferma che le ipotesi Sto facendo su come viene gestita la memoria e come funzionano [rilascio] e [autorelease]. Poiché la gestione della memoria è una parte davvero fondamentale e fondamentale, ma molto essenziale dell'esperienza di programmazione, mi piacerebbe essere sicuro di farlo nel modo giusto.rilascio/confusione autorelease nel cacao per iphone
Comprendo che qualsiasi cosa con allocazione, nuova o copia deve essere rilasciata.
Se faccio questo:
NSString *temp = [[NSString alloc] initWithString:@"Hello World"];
poi ho bisogno di aggiungere [rilascio temp/autorelease] alla fine, dal momento che ho un alloc.
Tuttavia, se faccio questo:
NSString *temp = @"Hello World";
Allora non sembra avere bisogno di un comunicato stampa. La classe NSString chiama automaticamente l'autorelease come parte del compito?
Inoltre, c'è una differenza tra i due oggetti temporanei qui dopo queste istruzioni? Entrambi contengono la stessa stringa, ma ci sono modi di memoria/utilizzo in cui differiscono?
In secondo luogo, con le proprietà, presumo che l'autorelease sia gestito automaticamente. Se ho questo:
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property NSString *firstName;
@property NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
//HERE!!!!
[super dealloc];
}
Sto assumendo non ho bisogno di aggiungere [firstName rilascio] e [rilascio Cognome] (in // QUI !!!!), dal momento che è gestita automaticamente dalle proprietà . È corretto?
capisco che se faccio questo nel codice (supponendo ho definito initWithFirstName):
Person *Me = [[Person alloc] initWithFirstName: @"Drew", lastName:"McGhie"];
che più tardi ho intenzione di dover usare [Me rilascio/autorelease];
Qualsiasi aiuto che conferma o corregge la mia comprensione fino ad ora è molto apprezzato.
POST RISPOSTA write-up
ho pensato di scrivere questo tutto in su dopo essere andato oltre tutte le risposte e testare i suggerimenti e parlare di quello che ha funzionato.
Ho bisogno di aggiungere il [firstName release], [lastname release], ma ho anche bisogno di aggiungere (conservare) alle descrizioni delle proprietà. Non aggiungere gli avvisi (conservati) causati perché presuppone (assegnare). Ecco come ho finalmente creato la classe
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
[firstName release];
[lastName release];
[super dealloc];
}
Non alloco/copio/conservo in modo esplicito firstName o lastName. È necessario perché l'allocazione è dedotta dalla generazione automatica di sintesi che non vedo nel codice? –
In un certo senso. Il problema è che il tuo oggetto "possiede" 'firstName' e' lastName', quindi quando sono impostati, diventa tua responsabilità rilasciarli. –