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;
}

数组 images 包含 200x150 大小的 UIImage,它们以 kb 为单位的尺寸约为 42kb,一个普通的 UIImage 数组。

当我为此 collectionview 重新加载数据时,我在 15 张图像后出现内存警告......有没有办法(作为线程)没有内存警告?

4

2 回答 2

2

不要将图像存储到数组中,这不是一个好习惯。随着图像数量或图像大小的增加,它会引发内存警告和崩溃。

备择方案:

  1. 将图像名称存储在数组中
  2. 将文件路径存储在数组中
  3. 将图像 url 存储在数组中并使用异步方法将图像加载到您的UITableViewUICollectionView
于 2013-11-06T16:25:25.740 回答
0

除了调整图像大小之外,您还可以在单​​元格滚动到视野之外时消除图像 - 只需实现:

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

此外,维护不会淹没系统的缓存的技巧是按照 Midhun 在评论中建议的操作 - 使用imageWithContentsOfFile。然后创建一个 NSCache,并使用图像名称或其他标识键将图像填充到其中。当您需要图像时,如果它在缓存中,请将其拉​​出。如果没有,您可以再次从文件系统中读取它。如果需要更多内存,iOS 将清除 NSCache。

于 2013-11-06T19:56:36.160 回答