2010-11-17 26 views
0

J'ai une méthode qui devrait retourner un UIImage créé à partir de contentsOfFile (pour éviter la mise en cache), mais quand il retourne, je reçois EXC_BAD_ACCESS. Courir à travers les Instruments ne révèle aucun résultat, car il fonctionne, sans s'arrêter sur un zombie.EXC_BAD_ACCESS en retournant UIImage

L'image est correctement copié dans la phase Bundle ... Ressources

- (UIImage *)imageForName:(NSString *)name { 
    NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"]; 
    return [UIImage imageWithContentsOfFile:path]; 

}

Cette méthode a été adaptée à partir de l'échantillon PhotoScroller, qui fonctionne correctement.

Merci

EDIT:

C'est le code qui utilise imageForName, et vous pouvez voir que j'ajouté Retain, selon Luc/suggestion de T, mais le EXC_BAD_ACCESS est sur le retour, pas mon addObject : call:

NSMutableArray *images; 

for (NSDictionary *dict in imageListForPage){ 
    [images addObject:[[self imageForName:[dict valueForKey:@"name"]]retain]]; 
} 
+0

Nous devons voir le code qui utilise imageForName, voir la réponse de Luc – willcodejavaforfood

Répondre

2

ImageWithContentsOfFile renvoie un objet auto-publié. Si vous ne le retenez pas (au retour [modifier]), vous aurez un mauvais accès.

Edit:

Vérifiez le pointeur de la NSArray. Vous devez initier le tableau soit alloc comme d'habitude ou utiliser le arraywith

par exemple.

NSMutableArray *images = [NSMutableArray arrayWithCapacity:ARRAY_CAPACITY];//autoreleased 

ou

NSMutableArray *images = [[NSMutableArray alloc] init];//release later 
+1

Ne conservez-le dans 'imageForName:' ​​lui-même, bien que. –

+0

J'ai modifié le code, ci-dessus, pour montrer ce qui se passe quand je l'ai fait. C'est comme si l'image ne pouvait pas être trouvée, mais je n'obtiendrais rien. – joec

0

Ajout d'un objet à un NSMutableArray envoie implicitement un retain, de sorte que ce n'est pas nécessaire dans votre code.

Pouvez-vous confirmer (ou en utilisant NSLog() un point d'arrêt) qui

[UIImage imageWithContentsOfFile:path]

retourne un objet dans votre méthode imageForName:?

0

Enfin, ce code doit être:

NSMutableArray *images = [NSMutableArray new]; // new is same as [[alloc] init] 

for (NSDictionary *dict in imageListForPage) { 
    [images addObject:[self imageForName:[dict valueForKey:@"name"]]]; 
} 
// ... do something with images 
[images release];