Le rapport d'erreur objc_msgSend provient parfois de Crashlytics

J'ai récemment reçu cette application après la mise à jour à Crashlytics 3.0 Je ne sais pas si elle vient de mon code ou d'autre chose. Le rapport d'accident est introuvable

Here is the crash report Crashed: com.apple.main-thread EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x000000009a0dbeb8 0 libobjc.A.dylib objc_msgSend + 16 release 1 CoreFoundation CFRelease + 524 2 CoreFoundation -[__NSArrayM dealloc] + 152 3 libobjc.A.dylib (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 564 4 CoreFoundation _CFAutoreleasePoolPop + 28 5 Foundation -[NSAutoreleasePool release] + 148 6 UIKit -[UIApplication _run] + 588 7 UIKit UIApplicationMain + 1488 8 MyAppName main.m line 32main 9 libdyld.dylib start + 4 

Il s'avère être bug du travail de cadre

Voici ce que j'ai obtenu du support de Crashlytics

Cela devrait être tout set si vous mettez à jour à 3.0.10 du Crashlytics SDK – il y avait une condition de course rare dans 3.0.9 que nous avons corrigé avec la dernière version. Ouvrez Fabric.app, mettez à jour le framework et vous serez prêt à partir 🙂

L'équipe de support de Crashlytics est géniale!

Confirmé cela a été introduit dans mon application par Crashlytics 3.0.9 publié le 10 Juin 2015 selon https://dev.twitter.com/fabric/overview/changelog .

Mis à jour à Crashlytics 3.0.10 et poussé à travers une mise à jour d'urgence le samedi. Les résultats parlent d'eux-mêmes:

Est passé de 99,9% Crash Free le lundi, a publié une mise à jour le mardi et le vendredi 26 Juin, le taux de Crash Free a chuté à 98,3%, ce qui était plus de 16 fois plus d'users victimes d'un accident. Le samedi 27 juin, j'ai pu requestr à Apple d'effectuer un examen accéléré des applications et la nouvelle version de Crashlytics 3.0.10 a été lancée dans l'App Store samedi. Comme vous pouvez le voir, le taux de Crash Free revient maintenant à 99% quelques jours après la sortie, revenant vers 99,9%.

J'espère que cela aidera ceux d'entre vous qui tirent vos cheveux sur un accident qui a été introduit par autre que votre cadre de collision. Au less, ils l'ont résolu rapidement et la nouvelle version semble résoudre complètement le problème.

 CoreFoundation _CFAutoreleasePoolPop + 28 

Le pool Autorelease est drainé, probablement à la fin de la boucle de l'interface user. Cela signifie que tous les objects autoreleased dans le pool sont maintenant libérés.

 CoreFoundation -[__NSArrayM dealloc] + 152 

Un tableau mutable est en cours de publication. Cela signifie que tous les objects qu'il tient sont en cours de publication.

 CoreFoundation CFRelease + 524 

L'un des éléments du tableau est en cours de publication.

Crash, l'article est invalide, il a déjà été désalloué.

La chose que vous devriez inspecter sont des éléments dans les arrays. Quelque chose est définitivement surlignée. Si vous utilisez le comptage manuel des references, vous devez inspecter les objects que vous placez dans les arrays: l'un des éléments est désalloué mais est toujours conservé dans un tableau.

Un code qui triggersra une erreur similaire sous MRC est le suivant:

 NSMutableArray *array = [NSMutableArray array]; //an autoreleased array NSObject *object1 = [[NSObject alloc] init]; NSObject *object2 = [[NSObject alloc] init]; [array addObject:object1] [array addObject:object2] [object1 release]; [object2 release]; //let's overrelease [object1 release]; //when array is released, it will send a release message to object1, too 

il semble que votre NSArray soit publié et que vous souhaitiez y accéder afin que ce crash se produise. vous pouvez définir votre NSArray comme Fort dans votre model ou VC

 @property(nonatomic, strong) NSArray *myArray 

Si vous ne pouvez pas deviner quel NSARRAY a été publié, je vous recommand de déboguer votre application avec NSZombie Object dans l'instrument pour find exactement NSArray

Cela arrive avec moi plusieurs fois. ajoutez juste une reference forte pour chaque NSArray dans votre code. et alors vous ne verrez jamais l'erreur comme vous l'avez vu.

Mieux vaut utiliser le code ci-dessous:

 @property(strong) NSArray *myArray.