0

パフォーマンスの問題を解決するために GCD を使用してコレクション ビューのセルを読み込もうとしていました。セルをロードするための私のコードは次のとおりです。

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

UICollectionViewCell *slideCell =
[collectionView dequeueReusableCellWithReuseIdentifier:slideCellIdentifier
                                          forIndexPath:indexPath];

slideCell.backgroundColor = [UIColor lightGrayColor];
slideCell.selectedBackgroundView = [[UIView alloc]initWithFrame:slideCell.bounds];
slideCell.selectedBackgroundView.backgroundColor  = [UIColor redColor];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    @autoreleasepool {
        SlideHeader *slideHeader = [self.fetchedResultsController objectAtIndexPath:indexPath];
        UIImageView *imageView = [[UIImageView alloc] init];
        imageView.contentMode = UIViewContentModeScaleAspectFill;
        imageView.clipsToBounds = YES;
        imageView.frame = CGRectMake(2, 2, slideCell.bounds.size.width-4, slideCell.bounds.size.height -4);

        if (slideHeader.frontCoverImage) {

            NSData *frontCoverImage = slideHeader.frontCoverImage;
            imageView.image = [UIImage imageWithData:frontCoverImage];

        }
        dispatch_async(dispatch_get_main_queue(), ^{



            NSArray *visibleCells = [self.collectionView visibleCells];
            if ([visibleCells containsObject:slideCell]) {


                [slideCell.contentView addSubview:imageView];



                if (slideHeader.slideTitle.length > 0) {


                    UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(slideCell.bounds.origin.x, slideCell.bounds.size.height - 30, slideCell.bounds.size.width, 30)];
                    titleLabel.text = slideHeader.slideTitle;
                    titleLabel.backgroundColor = [UIColor lightTextColor];
                    titleLabel.font = [UIFont boldSystemFontOfSize:18];
                    titleLabel.textColor = [UIColor blackColor];
                    titleLabel.textAlignment = UITextAlignmentCenter;
                    titleLabel.userInteractionEnabled = NO;
                    [slideCell.contentView addSubview:titleLabel];
                }
            }
        });
    }
});


return slideCell;

}

私はARCを使用しており、6.1で構築されています。arc が GCD メモリの解放を処理すると信じていますが、問題が発生しました。

以下は、メモリ使用量のスクリーン ショットです。

ここに画像の説明を入力

コレクションビューを上下にスクロールし続けると、メモリが上がりました。メモリが解放されるまでに長い時間がかかりました。これにより、メモリ使用量が十分に高いときにプログラムがクラッシュします。

私のコードのように GCD ブロックに autorealse を追加しようとしましたが、これはメモリをより速く解放するのに役立ちません。

この問題を解決するために何ができるか尋ねてもよろしいですか? ありがとうございました。

4

1 に答える 1

0

GCD ブロックを次のように変更して問題を解決します。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    @autoreleasepool {
        NSData *frontCoverImage;

        if (slideHeader.frontCoverImage) {

            frontCoverImage = slideHeader.frontCoverImage;



        }
        dispatch_async(dispatch_get_main_queue(), ^{



            NSArray *visibleCells = [self.collectionView visibleCells];
            if ([visibleCells containsObject:slideCell]) {

                imageView.image = [UIImage imageWithData:frontCoverImage];

                [slideCell.contentView addSubview:imageView];



                if (slideHeader.slideTitle.length > 0) {


                    UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(slideCell.bounds.origin.x, slideCell.bounds.size.height - 30, slideCell.bounds.size.width, 30)];
                    titleLabel.text = slideHeader.slideTitle;
                    titleLabel.backgroundColor = [UIColor lightTextColor];
                    titleLabel.font = [UIFont boldSystemFontOfSize:18];
                    titleLabel.textColor = [UIColor blackColor];
                    titleLabel.textAlignment = UITextAlignmentCenter;
                    titleLabel.userInteractionEnabled = NO;
                    [slideCell.contentView addSubview:titleLabel];
                }
            }
        });
    }
});
于 2013-07-27T19:24:27.650 に答える