Vous devriez toujours envoyer un objet autoreleased (ou le libérer après) à vos initialiseurs - les règles de gestion de la mémoire ne changent pas dans ce cas.
Dans votre exemple, je ferais ceci:
-(id) init {return [self initWithName:[[NSString new] autorelease]]]}
Cela corrigera votre fuite de mémoire et laisser toujours en place CONSTRUIRE.
Cependant, vous n'avez pas besoin retenir supplémentaire en passant par vos initializers - ce que vous faites avec self
est très bien. En règle générale, +alloc
conserve l'objet une fois et les méthodes -init
ne le conservent pas davantage. -init
sera appelé à plusieurs reprises que les appels [super init]
remonter dans l'arborescence de classe, mais l'objet ne doit être conservé une fois quand il est finalement retourné à l'appelant - +alloc
a déjà fait pour vous.
Cependant, commodité méthodes qui ne le font pas contiennent les mots init, copier ou nouveau doit retourner un objet autoreleased. A titre d'exemple:
+(MyObject *)objectWithName:(NSString *)aName {
return [[[MyObject alloc] initWithName:aName] autorelease];
}
FWIW, je normalement -init comme mon initialiseur désigné, donc au cas où j'oublie et envoie -init à un objet (ou quelqu'un d'autre fait la même chose), vous n'obtenez un objet corbeille. Par exemple:
-(id)init {
if (self = [super init]) {
[self setName:[[NSString new] autorelease]];
myReallyImportantiVar = [[NSArray alloc] init];
// etc;
}
return self;
}
-(id)initWithName:(NSString *)aName {
if (self = [self init]) {
[self setName:aName];
}
return self;
}
Cela peut être un peu moins efficace (lorsque vous utilisez la setName de -initWithName est appelé deux fois), mais il est beaucoup plus sûr.
Édition: erreurs de syntaxe supprimées. –