我收到了这样的崩溃报告:
*** 由于未捕获的异常“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
使用它的代码在默认优先级队列上执行之前无法释放该对象。崩溃似乎意味着它没有被保留。
我的假设是错误的还是我错过了其他东西?