Я не испытывал никаких сбоев в тестировании, но я получил несколько сообщений о падениях из iTunesConnect, которые выглядят следующим образом:IOS Crash - Асинхронный UIImageView setImage EXC_BAD_ACCESS
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x45d319f8
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x3a6595be objc_msgSend + 30
1 UIKit 0x34796e30 -[UIImageView setImage:] + 116
2 My App 0x000c40b2 -[AsyncImageView setImage:] (AsyncImageView.m:224)
3 My App 0x000c3950 __47-[AsyncImageView loadImageWithURL:animated:]_block_invoke_2 (AsyncImageView.m:147)
AsyncImageView является типичным UIImageView подкласса, который загружает изображения асинхронно от URL-адреса.
Вот актив код загрузки с номером обижая линии указывается:
- (void)loadImageWithURL:(NSURL *)url animated:(BOOL)animated {
if (url == nil) {
[self setImage:nil];
return;
}
self.imageAsset = [[Asset alloc] init];
self.imageAsset.assetURL = url;
AssetRequest *request = [[AssetRequest alloc] init];
request.assetURL = url;
__weak AsyncImageView *weakSelf = self;
self.assetLoader = [AssetLoader AssetLoaderWithRequest:request
completion:^(Asset *asset){
dispatch_async(dispatch_get_main_queue(), ^{
if (weakSelf.imageAsset.assetURL == asset.assetURL) {
weakSelf.imageAsset = asset;
if (animated) {
CATransition *transition = [CATransition animation];
transition.type = kCATransitionFade;
transition.duration = 0.20;
[weakSelf.layer addAnimation:transition forKey:nil];
}
[weakSelf setImage:weakSelf.imageAsset.assetImage]; //THIS IS LINE 147
[weakSelf setDisplayLoadingIndicator:NO];
[weakSelf stopAnimating];
}
});
}
error:^(NSError *err){
if (weakSelf.failedToLoad)
weakSelf.failedToLoad(url);
}];
[self.assetLoader load];
}
А вот где задает изображение, с номером обижая линии указывается:
- (void)setImage:(UIImage *)image {
if (image) {
[super setImage:image]; //THIS IS LINE 224
[self hidePlaceholderView];
if (self.imageLoadedBlock)
self.imageLoadedBlock();
}
else {
[self showPlaceholderView];
}
}
Отчет аварии указывает, что авария возникает при настройке изображения. Есть ли очевидная причина, почему это может произойти? Или любая дальнейшая проверка ошибок, которую я могу сделать (я уже проверяю, что изображение не является нулевым)? И снова это происходит не всегда, только время от времени.
И все же кажется, что изображение на самом деле не изображение - может быть, оно нулевое/ноль или повреждено. –
Еще лучше, попробуйте SDWebImage. –
Свершился ли он * без * проверки нуля в setImage? Это выглядит подозрительно для меня, тем более что он отключает nil'ing (то есть: удаление) изображения. – Eiko