次のようなクラッシュ レポートを受け取りました。
*** キャッチされない例外 'NSInvalidArgumentException' によりアプリを終了します。理由: '-[__NSMallocBlock__ CGImage]: 認識されないセレクターがインスタンス 0x1fb17f90 に送信されました'
これは通常、オブジェクトが割り当て解除され、別のオブジェクトが割り当て解除されたオブジェクトと同じアドレスに存在する場合に発生します。
これが私のコードです(CGImage
メソッドを呼び出しているアプリ内の唯一の場所):
@implementation UIImageView (MyApp)
- (void) setImageWithObject:(id)object
{
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[object URL]];
__typeof__(self) __weak weakSelf = self;
[self setImageWithURLRequest:imageRequest placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CGImageRef imageRef = [image CGImage];
CGRect rect = CGRectMake(0.f, 0.f, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef));
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, (size_t)roundf(CGRectGetWidth(rect)), (size_t)roundf(CGRectGetHeight(rect)), CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), CGImageGetColorSpace(imageRef), CGImageGetBitmapInfo(imageRef));
UIImage *decompressedImage = image;
if (bitmapContext)
{
CGContextDrawImage(bitmapContext, rect, imageRef);
CGImageRef decompressedImageRef = CGBitmapContextCreateImage(bitmapContext);
decompressedImage = [UIImage imageWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation];
CGImageRelease(decompressedImageRef);
CGContextRelease(bitmapContext);
}
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.image = decompressedImage;
});
});
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"%@", error);
}];
}
@end
オブジェクトを使用するコードがデフォルトの優先キューで実行される前にオブジェクトの割り当てを解除できないように、オブジェクトはブロックによって自動的に保持される必要があると想定しimage
ました (私は ARC を使用しています) 。image
クラッシュは、それが保持されていなかったことを意味しているようです。
私の仮定は間違っていますか、それとも何か他のものを見逃していますか?