2010-09-12 3 views
0

Une partie de mon application télécharge des images à partir d'Internet et les stocke dans un tableau mutable. Ceci afin qu'ils n'aient pas à être téléchargés chaque fois que l'utilisateur veut les voir. Lorsque je quitte la vue qui traite de ces images, le tableau mutable est libéré. S'il n'y a qu'une seule image stockée dans le tableau, tout se passe bien. Toutefois, s'il existe plusieurs images, l'application se bloque avec un EXC_BAD_ACCESS. En utilisant NSZombies, je reçois l'erreur suivante:Aide au débogage de la mémoire ObjC

*** -[UIImage isKindOfClass:]: message sent to deallocated instance 0x5b8eae0 

Cependant, je ne pas utiliser le message isKindOfClass dans mon application, il est évidemment envoyé par une autre méthode du système. Qu'est-ce qui cause l'envoi de ce message, comment puis-je corriger ce problème et pourquoi cela ne se produit-il que s'il y a plus d'une image dans le tableau? Merci.

+0

Pourriez-vous nous fournir du code source? – tia

Répondre

1

Il semble que vous relâchez trop vos objets image. Comme toutes les classes de collection Cocoa, une instance NSMutableArray conserve les objets ajoutés et les libère lorsqu'elle est elle-même libérée. Si vous créez un objet en utilisant un appel qui n'augmente pas son nombre de rétention, puis le relâchez une fois que vous l'avez ajouté au tableau, vous verrez ce type d'erreur.

Par exemple:

UIImage *image = [UIImage imageWithData:someData]; 
[myArray addObject:image]; 
[image release]; // <-- BAD! 

Vous ne possédez pas l'image de l'objet (parce que vous n'avez pas créé à l'aide d'alloc ou de copier), de sorte que vous n'avez pas besoin de le libérer. Le pointeur dans le tableau pointe maintenant vers un objet avec un nombre de retenue de zéro, qui sera éventuellement désalloué.

En utilisant autorelease au lieu de release dans l'exemple ci-dessus est également faux, pour la même raison.

+0

Merci. Cela a beaucoup aidé! Très apprécié, –

+0

Bonnes nouvelles! Content que cela ait aidé. –

0

Utilisez l'instrument Zombies dans Instruments. (Exécuter -> Exécuter avec les outils de performance -> Zombies)

Les instruments peuvent vous dire exactement où votre code a envoyé un message à un objet désalloué. Plus important encore, il peut vous dire toutes les retenues et les versions antérieures et, donc, exactement où et ce qui a été sur-relâché. Pour plus d'informations, reportez-vous au Instruments documentation.

+0

Je vais vérifier. Rapidement, pourquoi Zombie serait-il grisé dans le menu déroulant de Xcode? –