Question

Lors du chargement de mon application cacao, mon programme se bloque avec le message EXC_BAD_ACCESS. La trace de la pile n'est pas utile. Des indices sur la façon dont je peux trouver le problème?

Était-ce utile?

La solution

J'ai déjà vu des situations où cela peut arriver lorsque vous essayez d'accéder à un objet que vous n'avez pas conservé correctement. Ainsi, il ne pointe pas vers une copie valide de votre objet ou vers un objet d'un autre type. Placer les points d'arrêt à l'avance et analyser les objets à mesure que vous démarrez le démarrage à l'aide de po et d'impression dans gdb est votre meilleur choix.

Autres conseils

Cela indique généralement une erreur de gestion de la mémoire.

Assurez-vous que toutes vos déclarations de point de vente respectent les meilleures pratiques:

@interface MyClass : MySuperclass {
    UIClass *myOutlet;
}
@property (nonatomic, retain) IBOutlet UIClass *myOutlet;
@end

Ce format vous permet de gérer correctement la mémoire sur n'importe quelle plate-forme, quelle que soit sa classe.

Vérifiez toutes les méthodes awakeFromNib pour vous assurer que vous ne libérez pas trop d'objets, etc.

Nouvelle réponse à un ancien fil de discussion ... dans XCode 4, le moyen le plus efficace de diagnostiquer les exceptions EXC_BAD_ACCESS consiste à utiliser Instruments pour profiler votre application (dans XCode, cliquez sur Produit / Profil et choisissez Zombies). Cela vous aidera à identifier les messages envoyés aux objets désalloués.

Pour ajouter: la principale raison de l’échec de la désarchivage est l’oubli "return self"; à partir de -init d'une classe personnalisée. Ça fait mal beaucoup: (

Vérifiez le journal de la console (Applications / Utilities / Console.app). Lorsque le programme se bloque au démarrage et qu’il ya un problème avec l’initialisation, il écrit souvent des messages d’erreur utiles avant de se bloquer.

C’est une des raisons possibles. Un objet IBOutlet n'est pas en cours d'initialisation et un message est appelé sur nil. La trace de la pile pourrait ressembler à ceci:

#0    0x90a594c7 in objc_msgSend
#1    0xbffff7b8 in ??
#2    0x932899d8 in loadNib
#3    0x932893d9 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:]
#4    0x9328903a in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:]
#5    0x93288f7c in +[NSBundle(NSNibLoading) loadNibNamed:owner:]
#6    0x93288cc3 in NSApplicationMain
#7    0x00009f80 in main at main.mm:17

Comme la trace de la pile n’est pas utile, vous devrez parcourir votre code pour rechercher l’erreur. Si, pour une raison quelconque, vous ne parvenez pas à définir des points d'arrêt au début de votre exécution, essayez d'insérer un certain Debugger (); appels qui rompent avec le débogueur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top