objc_msgSend [__NSArrayM dealloc] 崩溃报告有时来自 Crashlytics

objc_msgSend [__NSArrayM dealloc] crash report sometimes from Crashlytics

我最近在更新到 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

您的 NSArray 似乎已发布并且您想访问它,因此发生了这次崩溃。 您可以在模型中将 NSArray 定义为 Strong 或 VC

@property(nonatomic, strong) NSArray *myArray

如果您猜不出哪个 NSArraY 已发布,我建议您使用仪器中的 NSZombie 对象调试您的应用程序以找到准确的 NSArray

这种事在我身上发生过很多次。只需为代码中的每个 NSArray 添加强引用。然后你将永远不会看到你所看到的错误。

最好使用下面的代码:

@property(strong) NSArray *myArray.
CoreFoundation  _CFAutoreleasePoolPop + 28

自动释放池正在耗尽,可能在 UI 循环结束时。这意味着池中所有自动释放的对象现在都已释放。

CoreFoundation  -[__NSArrayM dealloc] + 152

正在释放一个可变数组。这意味着它持有的所有项目也将被释放。

CoreFoundation  CFRelease + 524

数组中的一项正在释放。

崩溃,该项目无效,它已经被解除分配。

您应该检查的是数组中的项目。有些东西肯定是过度释放了。如果您正在使用手动引用计数,您应该检查放入数组中的对象 - 其中一项已被释放但仍保留在某个数组中。

在 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

原来是框架的bug

这是我从 Crashlytics 的支持中得到的

如果您更新到 Crashlytics SDK 的 3.0.10,这应该全部设置 - 我们用最新版本修补了 3.0.9 中的罕见竞争条件。打开 Fabric.app,更新框架,你就可以开始了:)

Crashlytics 的支持团队很棒!

根据 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% 的方向发展。

我希望这能帮助那些因崩溃框架而焦头烂额的人。至少他们很快解决了这个问题,新版本似乎完全解决了这个问题。