我们有一个与Crashlytics集成的实时应用。我们通过Crashlytics报告了一个罕见的崩溃...我们从来没有能够在调试器中复制它。最新版本是在Xcode 7.x中构建的,我们的部署目标是iOS 6.0,我们正在使用ARC。这是相关代码:
+(NSString*)stringFromItems:(NSArray*)items {
NSMutableArray* array = [NSMutableArray arrayWithCapacity:[items count]];
for (MyItem* item in items) {
[array addObject:item.dictionary];
}
NSData* data = nil;
@try {
if (![NSJSONSerialization isValidJSONObject: array]) {
NSLog(@"Tried to parse invalid JSON: %@", array);
return nil;
}
NSError* error = nil;
data = [NSJSONSerialization dataWithJSONObject:array options:0 error:&error];
if (!data || error) {
NSLog(@"Invalid input array: %@ resulted in serialization error: %@", items, [error localizedDescription]);
return nil;
}
}
@catch (NSException* exception) {
NSLog(@"Exception during serialization: %@", exception);
return nil;
}
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
以下是Crashlytics报告的堆栈跟踪:
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000018
0 Foundation 0x182cdcf60 _convertJSONString + 284
1 Foundation 0x182cdc39c _writeJSONString + 124
2 Foundation 0x182cdafbc _writeJSONValue + 116
3 Foundation 0x182cdd394 ___writeJSONObject_block_invoke + 236
4 CoreFoundation 0x1821da44c __65-[__NSDictionaryI enumerateKeysAndObjectsWithOptions:usingBlock:]_block_invoke + 88
5 CoreFoundation 0x1821c80f0 -[__NSDictionaryI enumerateKeysAndObjectsWithOptions:usingBlock:] + 224
6 Foundation 0x182cdcb20 _writeJSONObject + 360
7 Foundation 0x182cdb0d0 _writeJSONValue + 392
8 Foundation 0x182cdd57c ___writeJSONArray_block_invoke + 144
9 CoreFoundation 0x18217f944 __53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke + 132
10 CoreFoundation 0x18217f7b4 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 172
11 Foundation 0x182cdcd7c _writeJSONArray + 300
12 Foundation 0x182cdb170 _writeJSONValue + 552
13 Foundation 0x182cdaf00 -[_NSJSONWriter dataWithRootObject:options:error:] + 140
14 Foundation 0x182cdbf5c +[NSJSONSerialization dataWithJSONObject:options:error:] + 348
15 MyAppName 0x1000fd104 +[MyItem stringFromItems:] (MyItem.m:232)
因此对isValidJSONObject的调用成功,但是当我们尝试解析数组时,我们立即得到一个EXC_BAD_ACCESS,好像我们正在引用一个解除分配的对象(即使isValidJSONObject刚刚访问了数组字典中的所有相同对象)
我排除了大部分显而易见的答案...如果对象的任何问题都是问题,则isValidJSONObject返回false(非字符串键,非JSON可解析对象,如NSDate,NSNumber设置为NaN等) )。字典中的重复键会导致isValidJSONObject中出现EXC_BREAKPOINT异常。我们无法提出可能导致此特定崩溃的方案。
有人遇到过类似的东西吗?关于可能发生的事情的任何想法?非常感谢您的任何帮助!