web-dev-qa-db-ja.com

Crashlyticsからのobjc_msgSend [__NSArrayM dealloc]クラッシュレポート

Crashlytics 3.0にアップデートした後、このアプリを最近受け取りました。自分のコードによるものか、他の何かによるものかはわかりません。クラッシュレポートは追跡できません

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
27
Kong Hantrakool

フレームワークのバグであることが判明

これがCrashlyticsのサポートから得たものです

Crashlytics SDKの3.0.10に更新する場合、これはすべて設定されているはずです。3.0.9で、最新バージョンでパッチを適用したまれな競合状態がありました。 Fabric.appを開いてフレームワークを更新すれば、準備完了です:)

Crashlyticsのサポートチームはすばらしいです。

24
Kong Hantrakool

https://dev.Twitter.com/fabric/overview/changelog によると、これは2015年6月10日にリリースされたCrashlytics 3.0.9によって私のアプリに導入されたことを確認しました。

Crashlytics 3.0.10にアップデートし、土曜日に緊急アップデートを行いました。結果はそれを物語っています:

月曜日に99.9%クラッシュフリーから出て、火曜日にアップデートをリリースし、6月26日金曜日までにクラッシュフリー率は98.3%に低下しました。これは、クラッシュを経験しているユーザーの16倍以上の増加でした。 6月27日土曜日にAppleで迅速なApp Reviewを実行でき、Crashlytics 3.0.10の新しいバージョンが土曜日にApp Storeにリリースされました。クラッシュを確認できるようにリリース後数日でレートは99%に戻り、99.9%に戻ります。

これが、クラッシュフレームワーク以外で導入されたクラッシュで髪を引っ張っている人たちの助けになることを願っています。少なくとも彼らはそれを素早く解決し、新しいバージョンは問題を完全に解決したようです。

7
Polar Bear
CoreFoundation  _CFAutoreleasePoolPop + 28

自動解放プールは、おそらくUIループの終わりに排出されています。つまり、プール内のすべての自動解放オブジェクトが解放されます。

CoreFoundation  -[__NSArrayM dealloc] + 152

可変配列がリリースされています。それはそれが保持しているすべてのアイテムもリリースされていることを意味します。

CoreFoundation  CFRelease + 524

アレイ内のアイテムの1つがリリースされています。

クラッシュ、アイテムは無効です。すでに割り当てが解除されています。

検査する必要があるのは、配列内の項目です。何かが間違いなくオーバーリリースされています。手動参照カウントを使用している場合は、配列に入れたオブジェクトを検査する必要があります。項目の1つは割り当て解除されていますが、まだいくつかの配列に保持されています。

MRCで同様のエラーをトリガーするコードは次のとおりです。

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
6
Sulthan

nSArrayが解放されたようで、それにアクセスしたいので、このクラッシュが発生しました。 NSArrayをモデルまたはVCでストロングとして定義できます

@property(nonatomic, strong) NSArray *myArray

どのNSArraYがリリースされたかがわからない場合は、計測器のNSZombieオブジェクトを使用してアプリをデバッグし、正確なNSArrayを見つけることをお勧めします

2
Mo Farhand

それは私と何度も起こります。コード内のすべてのNSArrayに厳密な参照を追加するだけです。そして、あなたはあなたが見たようなエラーを見ることは決してないでしょう。

以下のコードを使用することをお勧めします。

@property(strong) NSArray *myArray.
2
Code Hunterr