0

私のアプリには、次のコードがあります。

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return images.count;
}

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

    static NSString *identifier = @"gallerycell";

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    UIImageView *backImageCell = (UIImageView*)[cell viewWithTag:100];
    [backImageCell setImage:[images objectAtIndex:indexPath.item]];

    if([indexPath row] == ((NSIndexPath*)[[collectionView indexPathsForVisibleItems] lastObject]).row){

[activity_view stopAnimating];
        [UIView animateWithDuration:0.8 animations:^{
            back.alpha = 0;
        }];
    }

    return cell;
}

配列イメージには 200x150 サイズの UIImage が含まれており、kb 単位のサイズは約 42kb であり、UIImage の通常の配列です。

このコレクションビューのデータをリロードすると、15 イメージの後にメモリ警告が表示されます...メモリ警告を表示しない方法 (スレッドとして) はありますか?

4

2 に答える 2

2

画像を配列に保存しないでください。これは良い習慣ではありません。画像の数または画像のサイズが大きくなると、メモリ警告がスローされてクラッシュします。

代替案:

  1. イメージ名を配列に格納する
  2. ファイルパスを配列に格納
  3. 画像の URL を配列に保存し、非同期メソッドを使用して画像をUITableViewまたはUICollectionView
于 2013-11-06T16:25:25.740 に答える
0

画像のサイズ変更に加えて、セルがスクロールして表示されなくなったときに画像を無効にすることができます-実装するだけです:

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath 

また、システムを圧倒しないキャッシュを維持するための秘訣は、Midhun がコメントで提案したようにすることです - use imageWithContentsOfFile. 次に、NSCache を作成し、イメージ名またはその他の識別キーを使用してその中にイメージを詰め込みます。画像が必要な場合は、キャッシュにある場合はそれを引き出します。そうでない場合は、ファイル システムから再度読み取ることができます。より多くのメモリが必要な場合、iOS は NSCache を消去します。

于 2013-11-06T19:56:36.160 に答える