2

アプリでコアデータを使用してNSFetchedResultsController、テーブルにデータを入力しています。私のデータベースには 40,000 以上のエントリがあるため、テーブルはかなり長くなります。各テーブル セルには、SDWebImageを使用して Web から読み込まれたサムネイル イメージがあります。ゆっくりスクロールするとすべてうまくいきますが、数秒以内に速くスクロールし始めるとクラッシュします。

NSZombies は有用なものを何も表示していません。

私はそれがSDWebImageWebからの読み込みに関係していると推測しています。その方法SDWebImageは、画像をバックグラウンドでロードし、ダウンロードが完了した後にダウンロードした画像を設定することです (wordy)。私の考えでは、セルがによって割り当て解除され、割り当て解除されたUITableViewセルSDWebImageに画像を設定しようとしています。そのため、いつ割り当てが解除されるかを判断できれば、ダウンロード プロセスをUITableViewCell停止して問題を解決できます。SDWebImage

追加してみました

- (void)dealloc {
    NSLog(@"dealloc");
}

セルの割り当てが解除されるタイミングをキャッチしますが、何も得られません。

EDIT-(void)deallocサブクラス UITableViewCell にメソッドがあります。

編集 ここにセルを作成する場所/方法があります

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
 static NSString* inventoryCellID = @"InventoryCustomCellID";

 InventoryCustomCell* cell = (InventoryCustomCell *)[tableView dequeueReusableCellWithIdentifier:inventoryCellID forIndexPath:indexPath];

 [self configureCell:cell atIndexPath:indexPath];

 return cell;
 }


- (void)configureCell:(InventoryCustomCell *)cell atIndexPath:(NSIndexPath *)indexPath {

    [cell formatCellWithProduct:[fetchedResultsController objectAtIndexPath:indexPath] enableAdding:NO];

    cell.openThumbnailButton.tag = indexPath.row;

    [cell.openThumbnailButton addTarget:self action:@selector(presentThumbnailViewWithCell:) forControlEvents:UIControlEventTouchUpInside];
}

私のカスタムセルでは、これは呼び出されている構成メソッドです:

- (void)formatCellWithProduct:(Product*)product enableAdding:(bool)addingEnabled {

    self.titleLabel.text = product.part_number;
    self.partNumberLabel.text = [[[product.manufacturer allObjects] objectAtIndex:0] name];

    //The SDWebImage UIImageView category method
    [self.thumbImageView setImageWithURL:[NSURL URLWithString:product.photo] placeholderImage:[UIImage imageNamed:@"icon.png"]];
}

編集 画像をダウンロードして設定するSDWebImageメソッドは次のとおりです。

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock;
{
    [self cancelCurrentImageLoad];

    self.image = placeholder;

    if (url)
    {
        __weak UIImageView *wself = self;
        id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
        {
            __strong UIImageView *sself = wself;
            if (!sself) return;
            if (image)
            {
                sself.image = image;
                [sself setNeedsLayout];
            }
            if (completedBlock && finished)
            {
                completedBlock(image, error, cacheType);
            }
        }];
        objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
}
4

2 に答える 2

16

テーブル ビューは、テーブル ビュー セルの割り当てと割り当て解除をあまり行わない傾向があります。セルの作成にはコストがかかるため、画面から消えたときに破棄されるのではなく、可能な場合は再利用されます。

このUITableViewDelegate方法-tableView:didEndDisplayingCell:forRowAtIndexPath:は、セルを更新してダウンロードやその他の不要な操作をキャンセルするのに適しています。

-setImageWithURL:etc:etc:ただし、への呼び出しのたびに、その画像ビューの以前のダウンロードをキャンセルしようとしているように見えます。

于 2013-04-09T03:00:23.193 に答える
0

あなたはdeallocメソッドをどこに置いたのか説明していません..

セルの割り当て解除が呼び出された場合 (tu subclass ではない) をテストするためだけに、デバッグのためにビューコントローラーにカテゴリを追加しようとすることができると思いますUITableviewCell

例えば:

@implementation UITableViewCell(Dealloc)

 - (void)dealloc {
   NSLog(@"dealloc");
   [super dealloc];
 }

@end

ARCを使用していますか?いいえ、あなたが忘れていない場合

InventoryCustomCell* cell = (InventoryCustomCell *)[[tableView dequeueReusableCellWithIdentifier:inventoryCellID forIndexPath:indexPath] autorelease];
于 2013-04-08T20:29:25.463 に答える