Je fais un bazar de créer un objet dans une méthode et de le renvoyer à une variable. Comme dans this post je sais que je devrais libérer un objet dans ce cas, mais quand je le fais, il se bloque.La création d'un objet autoreleased dans une méthode et le retour à une variable instanciée provoquent un plantage
J'ai écrit une méthode pour créer un tableau d'images et retourner ce tableau. Il ressemble à ceci:
- (NSMutableArray *)createImagesFor:(NSString *)animName withFrames:(int)numberFrames {
NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:numberFrames];
for (int i = 1; i <= numberFrames; ++i) {
NSString *imageName = [[NSString alloc]initWithFormat:@"%@%i.png", animName, i];
[imageArray addObject:[UIImage imageNamed:imageName]];
[imageName release];
}
return imageArray;
}
Je l'appelle comme ceci:
NSMutableArray *imageArray;
imageArray = [self createImagesFor:@"jumping" withFrames:2];
self.animationImages = imageArray;
[imageArray release];
Cependant, quand je lance l'analyseur de construction, il compile, mais avec la plainte suivante:
fuite potentielle d'un objet affecté à la ligne 109
1. La méthode renvoie un objet Objective-C avec un nombre de retenue +1 (référence propriétaire)
2. Objet l'objet affecté à la ligne 109 est renvoyé par une méthode dont le nom ('createImagesFor: withFrames:') ne contient pas 'copy' ou commence par '' new 'ou' alloc '. Cela constitue une violation des règles de la convention de nommage données dans le Guide de gestion de la mémoire pour le cacao (objet fuite)
J'ai regardé le document memory management mais autre que autoreleasing la variable (ce qui tombe en panne), je ne suis pas sûr où je vais mal. Voilà comment j'autoreleased il:
NSMutableArray *imageArray = [[[NSMutableArray alloc] initWithCapacity:numberFrames]autorelease];
J'ai essayé en conservant le * imageArray comme suggested here comme ceci:
NSMutableArray *imageArray;
[imageArray retain];
imageArray = [self createImagesFor:@"jumping" withFrames:2];
self.animationImages = imageArray;
[imageArray release];
Mais cette plante aussi.
L'analyseur suggère que je change le nom de la méthode à quelque chose comme 'newCreateImagesFor: withFrames:' mais je ne vois pas comment cela corrige les choses?
Merci pour l'aide.
Michael
Ok, je vois - je devrais utiliser des propriétés pour contenir les objets auto-libérés, et ne pas trop les relâcher. Et puisque j'utilise des propriétés, je n'ai pas besoin de m'inquiéter qu'elles seront autoreleased trop tôt. Merci! – Smikey
"Lorsque vous déclarez imageArray, il s'agit d'un pointeur nul vers la classe NSMutableArray". Seules les variables d'instance non initialisées sont garanties nulles. Les variables locales non initialisées peuvent être nulles ou peuvent être un nombre aléatoire de la dernière fois que le bloc de mémoire dans lequel elles sont stockées a été utilisé. – grahamparks
@Adam Ko: est-ce parce que la variable imageArray est une variable de pile pour la fonction et une fois l'appel de fonction terminé, le pointeur de la pile est désalloué et un autre accès utilisant le pointeur désalloué a causé son crash. – prajul