。(SDWebImageバージョン3.7.2) 最近、アプリが時々異常終了。(SDWebImageDownloaderOperation#cancelInternalで。)我々は我々のアプリでSDWebImageのLibを使用しているSDWebImageで時々、アプリのクラッシュ(SDWebImageDownloaderOperation#cancelInternal)
以下はstacktraceです。
Crashed: com.apple.main-thread EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0xxx Thread : Crashed: com.apple.main-thread 0 libobjc.A.dylib 0x180765bd0 objc_msgSend + 16 1 HOGE 0x1002a94d8 -SDWebImageDownloaderOperation cancelInternal 2 HOGE 0x1002a93ec -SDWebImageDownloaderOperation cancel 3 HOGE 0x1002ad63c __69-[SDWebImageManager downloadImageWithURL:options:progress:completed:]_block_invoke131 (SDWebImageManager.m:245) 4 HOGE 0x1002ae0f0 -SDWebImageCombinedOperation cancel 5 HOGE 0x1002b5380 -UIView(WebCacheOperation) sd_cancelImageLoadOperationWithKey: 6 HOGE 0x1002b0c74 -UIButton(WebCache) sd_cancelImageLoadForState: 7 HOGE 0x1002af578 -UIButton(WebCache) sd_setImageWithURL:forState:placeholderImage:options:completed: 8 HOGE 0x1002af3f8 -UIButton(WebCache) sd_setImageWithURL:forState:placeholderImage:options:
アボートポイントは以下のとおりです。
[imageButton sd_setImageWithURL:[NSURL URLWithString:url] forState:UIControlStateNormal placeholderImage:nil options:SDWebImageRetryFailed];
は
CollectionViewセルの表示ソースコード(これはコレクションビューセルのlayoutSubviewsと呼ばれています)。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
PhotoCollectionViewCell *cell = (PhotoCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
cell.photo = [_photos objectAtIndex:indexPath.row];
[cell.imageButton addTarget:self action:@selector(imageButtonPushed:) forControlEvents:UIControlEventTouchUpInside];
[cell setNeedsLayout];
// add Load processing
if (indexPath.row == _photos.count-1 && !_isLast) {
Photo *photo = [_photos objectAtIndex:indexPath.row];
[self pagingMyView:photo];
}
return cell;
}
#import <UIKit/UIKit.h>
#import "Photo.h"
@interface PhotoCollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UIButton *imageButton;
@property (strong, nonatomic) UIButton *likeButton;
@property (strong, nonatomic) Photo *photo;
@end
実装
@implementation PhotoCollectionViewCell
- (void)awakeFromNib
{
self.selectedBackgroundView = [[UIView alloc] initWithFrame:self.bounds];
self.selectedBackgroundView.backgroundColor = [BaseColorSet getColor1];
[_imageButton setBackgroundColor:[BaseColorSet getPhotoBackgroundColor]];
_imageButton.layer.cornerRadius = 2;
_imageButton.clipsToBounds = YES;
}
- (void)layoutSubviews
{
[super layoutSubviews];
NSString *url = [PhotoImgURL get_5:_photo];
if (!url) {
url = [NSString stringWithFormat:@"%@/%@/%@",S3_STORAGE_URL,[PhotoDirectory get_5],_photo.filename];
}
[_imageButton sd_setImageWithURL:[NSURL URLWithString:url] forState:UIControlStateNormal placeholderImage:nil options:SDWebImageRetryFailed];
_imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
_imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
_imageButton.imageView.contentMode = UIViewContentModeScaleToFill;
}
@end
MyCollectionViewControllerヘッダーなぜ異常終了?
このエラーを回避するにはどうすればよいですか?
編集
おかげで(それバート・アクセス・メモリ?です)。 それはまだ発売されていなかった、とPhotoCollectionViewCell(固定)
を次のようにコードを変更
@implementation PhotoCollectionViewCell
- (void)awakeFromNib
{
self.selectedBackgroundView = [[UIView alloc] initWithFrame:self.bounds];
self.selectedBackgroundView.backgroundColor = [BaseColorSet getColor1];
[_imageButton setBackgroundColor:[BaseColorSet getPhotoBackgroundColor]];
_imageButton.layer.cornerRadius = 2;
_imageButton.clipsToBounds = YES;
_imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
_imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
_imageButton.imageView.contentMode = UIViewContentModeScaleToFill;
}
-(void)prepareForReuse
{
[super prepareForReuse];
[_imageButton sd_cancelImageLoadForState:UIControlStateNormal];
}
@end
MyCollectionViewController(固定)
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
PhotoCollectionViewCell *cell = (PhotoCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
cell.photo = [_photos objectAtIndex:indexPath.row];
cell.imageButton.tag = cell.photo.photoId;
NSString *url = [PhotoImgURL get_5:cell.photo];
if (!url) {
url = [NSString stringWithFormat:@"%@/%@/%@",S3_STORAGE_URL,[PhotoDirectory get_5],cell.photo.filename];
}
[cell.imageButton sd_setImageWithURL:[NSURL URLWithString:url] forState:UIControlStateNormal placeholderImage:nil options:SDWebImageRetryFailed];
[cell.imageButton addTarget:self action:@selector(imageButtonPushed:) forControlEvents:UIControlEventTouchUpInside];
[cell setNeedsLayout];
// add Load processing
if (indexPath.row == _photos.count-1 && !_isLast) {
Photo *photo = [_photos objectAtIndex:indexPath.row];
[self pagingMyView:photo];
}
return cell;
}
*デバッグのヘルプ(「このコードはなぜ動作しないのですか?)」には、問題の内容、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法* – BSMP
@rmaddy申し訳ありません..そしてフォーマットに感謝します。今すぐコードをアップロードします。 – helloidea
http://sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html – matt