我观察到我的模拟器运行没有崩溃,但它一直在我的 iPhone (iOS 5.1) 和 iPad (iOS 6.1) 上发生。
经过很多努力,我象征性地指出了我的代码中的错误行 - 这里这个象征性的日志是:
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Crashed Thread: 12
Last Exception Backtrace:
0 CoreFoundation 0x342fd29e 0x3423b000 + 795294
1 libobjc.A.dylib 0x3c17197a 0x3c169000 + 35194
2 CoreFoundation 0x342fd1c0 0x3423b000 + 795072
3 CoreFoundation 0x3425e864 0x3423b000 + 145508
4 MyApp 0x0011626c __55-[MSCollectionViewController updateUI:]_block_invoke (MSCollectionViewController.m:385)
5 libdispatch.dylib 0x3c58911a 0x3c587000 + 8474
6 libdispatch.dylib 0x3c58d95c 0x3c587000 + 26972
7 libdispatch.dylib 0x3c58dabc 0x3c587000 + 27324
8 libsystem_c.dylib 0x3c5bda0c 0x3c5b7000 + 27148
9 libsystem_c.dylib 0x3c5bd8a0 0x3c5b7000 + 26784
任何人都可以猜到,错误出现在我的 MSCollectionViewController.m 文件的第 385 行。但是我仍然无法看到可能导致这种崩溃的原因,因为它在模拟器上运行良好。
更新的代码:
请注意,现在它在[m_photoArray addObject:photoDetailDict];
我添加m_photoArray (NSMutableArray)
初始化以供参考时崩溃,我正在主线程上执行此操作。
这是我的代码,包括有问题的第 385 行作为注释:
__block NSString * flickrPhotoArrayPath = [Commons getFlickrJSONPathForMuseumURI:argURI];
if (m_photoArray)
{
[m_photoArray removeAllObjects];
}
else
{
m_photoArray = [[NSMutableArray alloc] init];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
^{
NSArray *arrayFromFlickrJSON = [NSArray arrayWithContentsOfFile:flickrPhotoArrayPath];
if (!arrayFromFlickrJSON || [arrayFromFlickrJSON count]==0)
return;
if (bViewVisible)
{
[SVProgressHUD showWithStatus:@"Fetching Photos" maskType:SVProgressHUDMaskTypeBlack];
}
for (id photo in arrayFromFlickrJSON)
{
NSDictionary * dict = (NSDictionary *)photo;
NSMutableDictionary * photoDetailDict = [dict mutableCopy];
NSString * filePath = [photoDetailDict objectForKey:@"photoFilePath"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
[photoDetailDict setObject:image forKey:@"photoImage"];
//AND HERE GOES THE CRASH!!!
[m_photoArray addObject:photoDetailDict]; //Line 385
}
dispatch_async(dispatch_get_main_queue(), ^{
if ([SVProgressHUD isActive])
[SVProgressHUD dismiss];
//More code to update UI
});
});
这是我的两个问题:
- 我看到这个崩溃的 NSMutableDictionary setObject 是什么?
- 为什么我不在模拟器上用相同的数据集观察它?
更新:
立即在我的代码中发现故障:
[photo mutableCopy];
照片中的问题可能是id
类型,而不是NSDictionary
. 在执行之前,我需要NSDictionary
先将其转换为mutableCopy
.
仍然存在的主要问题是 - 为什么模拟器允许它?
哎呀,为什么连编译器都允许呢?