2009-02-18 6 views
3

Je travaille sur un jeu avec un tas de mini-jeux. A l'intérieur d'un Gameview, je le code suivant:UIImage imageNamed donnant EXC_BAD_ACCESS la deuxième fois

UIImage* img = [UIImage imageNamed:@"foo.png"]; 
someImage = CGImageRetain(img.CGImage); 
[img release]; 

someImage est de type CGImageRef, et cela n'a aucun problème pour la première fois. Après que l'utilisateur a perdu le mini-jeu (ou les sorties), le jeu et tout semble se détraquer correctement. Ensuite, s'ils retournent dans le mini-jeu, et le jeu se construit à nouveau, la ligne:

someImage = CGImageRetain(img.CGImage); 

provoque une erreur de quelque sorte ... presque comme mon objet UIImage est sorti déjà. Je sais qu'il y a quelques bizarreries à utiliser [UIImage imageNamed], mais je ne peux pas le faire du tout. Toute aide serait grandement appréciée :)

Répondre

11

Cette ligne est votre problème;

[img release]; 

En cacao la convention générale est que si une fonction retourne un objet et ne contient pas les mots copier ou alloc alors vous ne devez pas le libérer.

Les fonctions renvoyant des objets les ajoutent généralement à un pool de libération automatique. Si vous prévoyez de conserver l'objet, vous devez le conserver (et le relâcher plus tard). Sinon, il sera automatiquement libéré.

Si vous essayez de libérer l'un de ces objets, cela provoquera un problème. Dans ce cas, je suspecte qu'il libère une ressource que le système d'exploitation croit encore posséder.

This thread contient plus de détails sur la gestion de la mémoire sous Cocoa.

+0

Ça a l'air de le faire ... merci :) Un de ces jours, je vais comprendre les objets dont j'ai besoin de garder une trace. :) – Jonas

Questions connexes