0

私のXCodeバージョンは4.2.1で、iOSバージョンは5.0 ARC有効コードです。私のプロセスは、Web サービスを使用してテーブルビューで多数の YouTube ビデオを表示することです。これらのビデオ アイコンを自分のディレクトリにキャッシュします。そのアプリケーションをアップルレビューに送信すると...アプリケーションがそこでクラッシュし、クラッシュレポートは次のとおりです。

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  2

アプリケーション固有の情報:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet bytes]: unrecognized selector sent to instance 0x27b300'
*** First throw call stack:
(0x3502e88f 0x36455259 0x35031a9b 0x35030915 0x34f8b650 0x34f7da4d 0x3587f2b9 0x3587ef31 0x3587ee9d 0x321102ab 0x321101c7 0xe36dd 0x31053c59 0x3105f7bb 0x36cd9dfb 0x36cd9cd0)

Thread 2 name:  Dispatch queue: com.apple.root.default-priority
Thread 2 Crashed:

0   libsystem_kernel.dylib          0x34e2232c __pthread_kill + 8
1   libsystem_c.dylib               0x36d1e208 pthread_kill + 48
2   libsystem_c.dylib               0x36d17298 abort + 88
3   libc++abi.dylib                 0x309e3f64 abort_message + 40
4   libc++abi.dylib                 0x309e1346 _ZL17default_terminatev + 18
5   libobjc.A.dylib                 0x36455350 _objc_terminate + 140
6   libc++abi.dylib                 0x309e13be _ZL19safe_handler_callerPFvvE + 70
7   libc++abi.dylib                 0x309e144a std::terminate() + 14
8   libc++abi.dylib                 0x309e2798 __cxa_throw + 116
9   libobjc.A.dylib                 0x36455290 objc_exception_throw + 88
10  CoreFoundation                  0x35031a94 -[NSObject doesNotRecognizeSelector:] +   168
11  CoreFoundation                  0x3503090e ___forwarding___ + 294
12  CoreFoundation                  0x34f8b648 _CF_forwarding_prep_0 + 40
13  CoreFoundation                  0x34f7da46 CFDataGetBytePtr + 90
14  ImageIO                         0x3587f2b2 CGImageReadGetBytePointer + 30
15  ImageIO                         0x3587ef2a _CGImageSourceBindToPlugin + 86
16  ImageIO                         0x3587ee96 CGImageSourceGetCount + 50
17  UIKit                           0x321102a4 _UIImageRefFromData + 124
18  UIKit                           0x321101c0 -[UIImage initWithData:] + 52
19  MyAppName                   0x000e36d6 __37-[JMImageCache imageForURL:delegate:]_block_invoke_0 + 142
20  libdispatch.dylib               0x31053c52 _dispatch_call_block_and_release + 6
21  libdispatch.dylib               0x3105f7b4 _dispatch_worker_thread2 + 256
22  libsystem_c.dylib               0x36cd9df4 _pthread_wqthread + 288
23  libsystem_c.dylib               0x36cd9cc8 start_wqthread + 0

アプリケーションのコーディング部分、On Table ビュー データ ソース メソッド

   if(![[JMImageCache sharedCache] isImageExistInCache: cell.videoThumbnailImageLink]){
    [cell.activityIndicator startAnimating];
    cell.videoThumbnail.image = [[JMImageCache sharedCache] imageForURL:cell.videoThumbnailImageLink delegate:cell];
}
else{
    [cell.activityIndicator stopAnimating];
    [cell.activityIndicator removeFromSuperview];
    cell.videoThumbnail.image = [[JMImageCache sharedCache] imageFromDiskForURL:cell.videoThumbnailImageLink];
}

そして、そのテーブルビューのカスタムセルで、

#pragma mark - JMImageCacheDelegate Methods
                                                                                               - (void) cache:(JMImageCache *)c didDownloadImage:(UIImage *)i forURL:(NSString *)url {
         if([url isEqualToString:self.videoThumbnailImageLink]) {
      self.imageView.image = i;
      [self setNeedsLayout];
}
    [self.activityIndicator stopAnimating];
[self.activityIndicator removeFromSuperview];

}

JMImageCache ライブラリ コード ブロックでは、

- (UIImage *) imageForURL:(NSString *)url delegate:(id<JMImageCacheDelegate>)d {
    if(!url) {
        return nil;
    }

    id returner = [super objectForKey:url];

    if(returner) {
        return returner;
    } else {
        UIImage *i = [self imageFromDiskForURL:url];

        if(i) {  
            [self setImage:i forURL:url];

            return i;
        }

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            __unsafe_unretained NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
            UIImage *i = [[UIImage alloc] initWithData:data];

            __unsafe_unretained NSString* cachePath = cachePathForURL(url);
            NSInvocation* writeInvocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(writeData:toPath:)]];
            [writeInvocation setTarget:self];
            [writeInvocation setSelector:@selector(writeData:toPath:)];
            [writeInvocation setArgument:&data atIndex:2];
            [writeInvocation setArgument:&cachePath atIndex:3];

            [self performDiskWriteOperation:writeInvocation];
            [self setImage:i forURL:url];

            dispatch_async(dispatch_get_main_queue(), ^{
                if(d) {
                    if([d respondsToSelector:@selector(cache:didDownloadImage:forURL:)]) {
                        [d cache:self didDownloadImage:i forURL:url];
                    }
                }
            });
        });

        return nil;

    }
}

ありがとう。

4

2 に答える 2

2

データは使用される前に解放され、割り当てが解除されるため、CoreGraphics がそのデータに対して -bytes を呼び出すと、データは存在しなくなります (この場合、代わりに NSSet が割り当てられています)。

おそらくこれは、__unsafe_unretained として宣言したためです。

于 2012-04-23T04:57:45.527 に答える
2

記憶に問題があります。0x27b300ヒントは、メモリ内で を指す変数に__NSCFSet(別名として知られるNSSet) が含まれていることです。nil'd out されていないかweak、そうあるべきときにある変数を使用していないことを確認してくださいstrong

于 2012-04-23T04:58:38.737 に答える