1

シミュレーターの実行ではクラッシュは見られませんでしたが、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 ファイルの Line#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
        });
    });

ここに私の2つの質問があります:

  • このクラッシュが見られるのは NSMutableDictionary setObject の何ですか?
  • シミュレーターで同じデータセットを使用して観察しないのはなぜですか?

アップデート:

私のコードですぐにグリッチが見つかりました:

問題はおそらく[photo mutableCopy];写真にあるものであり、idタイプのものではありませんNSDictionaryNSDictionaryを実行する前に最初にキャストする必要がありmutableCopyます。

主な問題はまだ残っています-なぜシミュレーターがそれを許可するのですか?

一体、なぜコンパイラでさえそれを許可するのですか?

4

0 に答える 0