Ho alcune domande sulle proprietà sintetizzate in Objective-C. Segue l'elenco completo, ma la domanda di base è questa: Come fa il compilatore a garantire che gli ivars per le proprietà sintetizzate vengano rilasciati correttamente, anche se il mio codice può includere o meno metodi di rilascio in dealloc?In che modo viene rilasciata la release per le proprietà di ritenzione @synthesized?
Nota: ho deciso di non inserire questi come singoli domande perché sono così strettamente correlati e perché ci sono una manciata di domande esistenti che tocco sui singoli problemi senza realmente arrivare al cuore della questione.
domande in qualche modo simili:
- Does property retain need a release?
- What's the difference between property and synthesize?
- Question on retain attribute with property and synthesize
Setup: Si consideri una classe con una singola proprietà:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
Domanda # 1: Il caso molto semplice:
@implementation Person
@synthesize name;
@end
Con questa impostazione, presumo che name
uscirà automaticamente ogni volta che un oggetto Person
viene rilasciato. Nella mia mente, il compilatore inserisce semplicemente [name release]
nel metodo dealloc
come se lo avessi digitato io stesso. È corretto?
Domanda # 2: Se scelgo di scrivere il mio metodo dealloc
per questa classe, e tralascio una chiamata a [name release]
, sarà quella perdita?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
Domanda # 3: Se scelgo di scrivere il mio metodo dealloc
per questa classe, e io includo una chiamata a [name release]
, volontà che si traducono in una doppia versione, dal momento che @synthesize
si è già preso cura di me per me?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end
Domanda # 4: Se scelgo di scrivere il mio di accesso di proprietà per questa classe, ma io Non scrivere il mio metodo dealloc
, sarà name
essere trapelato?
@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end
Domanda # 5: ho la sensazione che (in base all'esperienza) che nessuno degli scenari di cui sopra si tradurrà in perdite o doppio-release, dal momento che il linguaggio è stato progettato al fine di evitare loro. Questo, naturalmente, solleva la questione di "come?". Il compilatore è abbastanza intelligente da tenere traccia di ogni possibile caso? E se dovessi fare la seguente (si noti che questo è un esempio ridicolo, proprio lo scopo di illustrare il mio punto):
void Cleanup(id object) { [object release]; }
@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end
Would che ingannare il compilatore in aggiunta di un altro [name release]
al metodo dealloc
?
Grazie per la risposta dettagliata. Sono contento di averlo chiesto! –
Molto ben spiegato! –