Domanda

Sto cercando di capire cosa sta succedendo nel getter qui sotto, questo è quello che ho capito finora:

(1) il getter restituisce un puntatore a un oggetto NSString. (2) l'oggetto NSString viene mantenuto, probabilmente perché gli abbiamo appena dato un puntatore. (3) rilascio automatico? quando si attiva, quando l'istanza PlanetClass è deallocata (rilasciata)?

// CLASS
@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

// GETTER
- (NSString *)planetName{
        return[[planetName retain] autorelease];
}

EDIT: penso di essere più confuso riguardo al motivo dell'effettiva conservazione e della successiva versione. la mia comprensione è stata che il getter ha semplicemente restituito un puntatore a zero o a un oggetto già esistente (ovvero è stato impostato dal setter) Penso di aver capito il trattenimento dato che stiamo dando via un puntatore e dobbiamo rintracciarlo, ma che dire di il rilascio, è solo un caso in caso di sicurezza che in seguito dimentico di rilasciare l'oggetto NSString?

La variabile di istanza planetName è anche rilasciata nel mio metodo dealloc (vedi sotto) il rilascio automatico sembra fare lo stesso, poco dopo quando il pool viene svuotato?

- (void)dealloc {
        [planetName release];
        [super dealloc];
}

evviva -gary-

È stato utile?

Soluzione

Potrebbe essere una buona idea lasciare che Objective-C gestisca questo come una proprietà, permettendoti di ripulire parte dell'implementazione per mantenere la gestione della memoria, beh, gestibile:

@interface PlanetClass : NSObject {
    NSString* planetName;
}
@property(nonatomic, retain) NSString* planetName;
@end // PlanetClass

@implementation PlanetClass
@synthesize planetName
//... rest of PlanetClass here
@end // PlanetClass

Esistono abbondanza di documenti disponibile online per maggiori dettagli su Proprietà Objective-C e @synthesize .

Documenti di gestione della memoria

Consiglio vivamente questa lettura dalla memoria di Apple gestione per cercare di aiutare a capire di cosa si occupa tutto il trattenere / rilasciare .

Altri suggerimenti

Quando il rilascio automatico è inviato a un oggetto, viene aggiunto al pool di rilascio automatico. Quando il pool viene svuotato, invia il rilascio a tutti gli oggetti nel pool. Pertanto, qualsiasi oggetto nel pool di rilascio automatico verrà rilasciato quando il pool viene svuotato

Il ritorno / autorelease nel metodo getter non sta facendo nulla, puoi semplicemente restituire planetName

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top