Question

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) bt
#0  0x30011940 in objc_msgSend ()
#1  0x30235f24 in CFRelease ()
#2  0x308f497c in -[UIImage dealloc] ()
#3  0x30236b78 in -[NSObject release] ()
#4  0x30a002a0 in FlushNamedImage ()
#5  0x30250a26 in CFDictionaryApplyFunction ()
#6  0x30a001a4 in _UISharedImageFlushAll ()
#7  0x30a00738 in +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] ()
#8  0x3054dc80 in _nsnote_callback ()
#9  0x3024ea58 in _CFXNotificationPostNotification ()
#10 0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#11 0x3054dbc0 in -[NSNotificationCenter postNotificationName:object:] ()
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
#13 0x30a006a8 in -[UIApplication _receivedMemoryNotification] ()
#14 0x30a005d8 in _memoryStatusChanged ()
#15 0x30217416 in __CFNotificationCenterDarwinCallBack ()
#16 0x3020d0b0 in __CFMachPortPerform ()
#17 0x30254a76 in CFRunLoopRunSpecific ()
#18 0x3025416a in CFRunLoopRunInMode ()
#19 0x320452a4 in GSEventRunModal ()
#20 0x308f037c in -[UIApplication _run] ()
#21 0x308eea94 in UIApplicationMain ()
#22 0x00002096 in main (argc=1, argv=0x2ffff514)

Actuellement, j'ai une erreur très bizarre dans mon programme. Parfois, il arrive, et parfois, il ne fonctionne pas. Mais voici un résumé de ce qui se passe:

Lorsque le programme démarre:

  • les données enregistrées (à une courte plist se compose de 13 éléments) est chargé si elle existe.
  • un énorme plist contenant des chaînes 1014 est chargé dans NSMutableDictionary.
  • un autre plist contenant 78 des chaînes est chargé dans un NSArray.
  • un film .mp4 est joué.

L'erreur se produit dans une partie où View OpenGL ES est supprimé et l'utilisateur est sur le point de voir l'une des chaînes des 1014 chaînes dans le NSMutableDictionary.

Cette erreur ne se produit dans le simulateur. Il se produit uniquement sur l'iPhone, et parfois, il fonctionne très bien, mais parfois, il broie.

Cependant, après avoir lu le stacktrace, je vois CFDictionaryApplyFunction là-bas, donc je pense qu'il pourrait être l'une des causes possibles. Est-ce parce que sur le simulateur, il lit des choses si vite que le dictionnaire entier du plist est chargé à un instant, alors que sur l'appareil, il lit plus lent? Honnêtement, je ne sais pas exactement comment fonctionne le dictionnaire. Est-ce qu'il a lu toutes les chaînes 1014 à un instant ou il utilise d'autres threads de lire lentement? S'il vous plaît conseiller. Merci.

Était-ce utile?

La solution

Lorsque vous obtenez un EXC_BAD_ACCESS, cela signifie souvent que vous essayez d'appeler une méthode sur un objet qui est pas là -. Probablement parce qu'il a été désallouée

Vers le milieu de la trace, il y a des avertissement mémoire appels , par exemple:

#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()

Ce qui fait apparaître qu'aucun de votre code est directement provoquant l'accident, mais plutôt une notification du système lorsque la mémoire est faible.

Plus près de l'image # 0, il semble tenter d'effacer le cache d'un objet UIImage, et cela semble être l'accès mauvais.

Sur cette base, on suppose que vous attribuer un pointeur sur la valeur de retour autoreleased d'un constructeur de commodité; l'objet est autoreleased, et vous pourriez penser qu'il est bien parce que vous n'utilisez pas l'image directement, mais l'avertissement de mémoire tente d'y accéder. Par exemple:

@interface MyClass {
  UIImage* myImage;
}
// ...
- (id) init {  /* the usual stuff */
  myImage = [UIImage imageNamed:@"bob_the.png"];
  return self;
}

Dans cet exemple, même si vous avez de conserver les biens mis en place sur myImage, vous n'êtes pas en conservant réellement l'image sauf si vous définissez la valeur par self.myImage. Donc, peu de temps après cet appel, l'image est libéré, et vous avez un pointeur sur la terre no man.

Sans voir le code, je n'ai aucun moyen de savoir si c'est ce qui se passe réellement, mais il est un type d'erreur qui est facile à faire.

Ces questions liées donnent des conseils sur les accidents similaires: débogage EXC_BAD_ACCESS 1 et question 2 .

Enfin, si rien de tout cela aide, je suggère de trouver un reproduction minimale de votre problème. La façon difficile à faire est de copier votre code, découper la moitié, si l'erreur est toujours là, et répéter jusqu'à ce que vous obtenez le vous pouvez trouver plus petit code qui reproduit l'erreur. Il est généralement beaucoup plus facile à déboguer à partir de là (et plus postable comme une question stackoverflow, aussi!) Si vous connaissez le chemin facile, laissez-moi savoir.

Autres conseils

Vous pouvez définir la variable d'environnement NSZombiesEnabled. De cette façon, votre application ne plantera pas avec EXC_BAD_ACCESS lors de l'accès aux objets libérés, mais enregistre plutôt un message d'information à votre console. Ce blog explique assez bien ce qui se passe et comment le configurer dans XCode. Quoi qu'il en soit, jamais jamais oublier de désactiver cette option dans les versions de production, car sinon vos objets ne seront jamais libérés!

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