Getter Sequence Of Events?
-
05-07-2019 - |
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-
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