J'ai quelques questions à propos de synthétisés propriétés en Objective-C. La liste complète suit, mais la question de fond est: Comment le compilateur s'assurer que le ivars pour synthétisés propriétés sont bien sorti, même si mon code ne peut ou peut ne pas inclure la libération des méthodes dans le dealloc?
Note: j'ai décidé de ne pas publier ces questions parce qu'ils sont si étroitement liés, et parce qu'il y a une poignée de questions existantes, que le toucher sur les enjeux individuels sans vraiment rentrer dans le cœur de la question.
Un peu les mêmes questions:
- N'a la propriété de conserver besoin d'une libération?
- Quelle est la différence entre propriété et de synthétiser?
- Question sur conserver un attribut de la propriété et de synthétiser
Programme d'installation: Considérons une classe avec une seule propriété:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
Question #1: Les principes de base de l'affaire:
@implementation Person
@synthesize name;
@end
Avec cette configuration, je suppose qu' name
sera automatiquement libéré à chaque fois qu'un Person
objet est libéré. Dans mon esprit, le compilateur insère simplement [name release]
dans la dealloc
méthode comme si j'avais tapé moi-même. Est-ce exact?
Question n ° 2: Si j'ai choisi d'écrire mon propre dealloc
méthode de cette classe, et je omettre un appel à l' [name release]
, cette fuite?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
Question #3: Si j'ai choisi d'écrire mon propre dealloc
méthode de cette classe, et je inclure un appel à l' [name release]
, résultat dans une double version, car @synthesize
a déjà pris soin d'elle pour moi?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end
Question #4: Si j'ai choisi d'écrire mon propre propriété accesseur pour cette classe, mais je ne pas écrire mon propre dealloc
méthode, sera name
"fuites"?
@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end
Question #5: j'ai le sentiment (basée sur l'expérience) qu' aucun des scénarios ci-dessus entraînera des fuites ou double-publications, puisque la langue a été conçu pour les éviter. Qui, bien sûr, pose la question du "comment?". Est le compilateur simplement assez intelligent pour garder une trace de chaque cas possible? Si je ne le suit (notez que c'est d'un ridicule exemple, juste pour illustrer mon point de vue):
void Cleanup(id object) { [object release]; }
@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end
Serait-ce tromper le compilateur en ajoutant un autre [name release]
de la dealloc
méthode?