パフォーマンスの問題を解決するために 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 を追加しようとしましたが、これはメモリをより速く解放するのに役立ちません。
この問題を解決するために何ができるか尋ねてもよろしいですか? ありがとうございました。