1

セクション化されたテーブルビューについて少し絶望的です。以下のような 4 つの画像を持つカスタム UITableViewCell を使用します。

私のカスタム UITableViewCell

各セルの SDWebImage を介して画像をロードしようとしています。

読み込み手順はすべて、UITableViewController ではなく、カスタム UITableViewCell で行われます。現在のセルで次のコードを実行するcellForRowAtIndexPathi just 呼び出しから:[cell setup]

NSArray *imageViews = [NSArray arrayWithObjects:self.imageView1, self.imageView2, self.imageView3, self.imageView4, nil];

for (int i = 0; i < self.products.count; i++) {

    Product *currentProduct = [self.products objectAtIndex:i];
    UIImageView *currentImageView = [imageViews objectAtIndex:i];

    NSString *thumbURL = [[CommonCode getUnzippedDirectory] stringByAppendingPathComponent:currentProduct.collectionFolderName];
    thumbURL = [thumbURL stringByAppendingPathComponent:thumbFolder];
    thumbURL = [thumbURL stringByAppendingPathComponent:currentProduct.product_photo];

    [currentImageView setContentMode:UIViewContentModeScaleAspectFit];

    [currentImageView setImageWithURL:[NSURL fileURLWithPath:thumbURL]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
}

画像はすべてドキュメント ディレクトリに保存され、最大サイズを超えません。500キロバイト。

問題:

私の問題は、テーブルビューをスクロールすると突然クラッシュし、その理由がわからないことです。すべての例外に対してシンボリック ブレークポイントを有効にすると、SDWebImage の 1 行が原因でクラッシュすることが示されます。残念ながら、デバッガーの出力はありません: (イメージが割り当てられている場所でクラッシュします)

UIImage *image = nil;
if ([imageOrData isKindOfClass:[NSData class]])
{
    image = [[UIImage alloc] initWithData:(NSData *)imageOrData];
}

dispatch_asnycまた、同様の結果で画像を読み込もうとしました。同時ファイル操作と関係がある可能性はありますか?

さらに、SDWebImage のキャッシュをクリアする必要があるため、非常に速くスクロールするとメモリ警告が表示されます。同時に、上記の SDWebImage のコード行で停止します。

私はすでに 2 日間 Web を検索しましたが、役に立つものは見つかりませんでした。この問題を解決するためのヒントをいただければ幸いです。クラッシュ レポートなどの追加データが必要な場合は、お知らせください。すぐに提供いたします。

4

1 に答える 1

0

同じ問題に遭遇しましたが、一時的に以下のように解決しましたが、特にiPhone 4sでメモリの問題が発生します

NSArray *arrImgs = cellModel.thumbnails_qqnews;
if (arrImgs.count > 0) {
    [self.imgView.subviews enumerateObjectsUsingBlock:^(__kindof UIImageView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [obj sd_setImageWithURL:[NSURL URLWithString:arrImgs[idx]] placeholderImage:[UIImage imageNamed:@"placeholdImage"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
            if (image != nil) {
                obj.image = [UIImage cutImageWithTargetSize:[NEMulTiNewsCell getImgSize] image:image];
            }
        }];
    }];
}

複数の画像のダウンロードは非論理的だと思いますが、複数の画像をダウンロードしてから複数の画像を1つの画像に描画してから表示する方法だと思いますが、多数のコード行が作成される可能性があります。

于 2017-04-10T03:33:24.103 に答える