2016-04-18 22 views
-2

。(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; 
} 
+0

*デバッグのヘルプ(「このコードはなぜ動作しないのですか?)」には、問題の内容、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法* – BSMP

+0

@rmaddy申し訳ありません..そしてフォーマットに感謝します。今すぐコードをアップロードします。 – helloidea

+0

http://sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html – matt

答えて

1

あなたはUITableViewCellの中SDWebImageViewまたはSDWebImageButtonを使用する場合と、 UICollectionViewCellでは、「セルの再利用タイミング」と「非同期ダウンロードとイメージタイミングの設定」に注意する必要があります。

これはスクロールすると発生します。非同期ダウンロードが完了すると、uiはすでに別のセルで再利用されています。 、(私は推測)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

または

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

使用SDWebImage APIをこのエラーを回避し、 '__block' とUIのポインタをつかむために

の場合'cellForItemAtIndexPath'に関するより多くのコードを表示すると、私はあなたを助けることができます。

+0

ありがとう!私は 'cellForItemAtIndexPath'についてMyViewControllerを表示します – helloidea