在UICollectionView iOS 7中收到内存警告

时间:2014-01-03 08:25:05

标签: ios objective-c ios7 uicollectionview didreceivememorywarning

我正在使用UICollectionView使用资源显示我的库中可用的所有图像,它显示所有图像但是当我多次向上和向下滚动时,我在设备中收到内存问题并且在一段时间之后它会崩溃说由于记忆压力而崩溃 使用的代码如下

在此创建collectionview并设置其委托

UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
allPhotosCollectionView=[[UICollectionView alloc]initWithFrame:CGRectMake(5, 5, 310, 481)collectionViewLayout:layout];
[allPhotosCollectionView setDelegate:self];
[allPhotosCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
[allPhotosCollectionView setDataSource:self];
[self.view addSubview:allPhotosCollectionView];

委托方法

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section
{
return [allImageArray count];
}
- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView
{
return 1;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:       (UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath   *)indexPath
{
return CGSizeMake(95, 100);
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
NSString *identifier = @"Cell";
UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
// allimageArray has the Assest URL fo the images
NSURL *aURL=[[NSURL alloc]initWithString:[NSString stringWithFormat:@"%@",[allImageArray objectAtIndex:indexPath.row]]];
[assestLibrary assetForURL:aURL resultBlock:^(ALAsset *asset)
 {
     UIImage  *copyOfOriginalImager = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage] scale:0.5 orientation:UIImageOrientationUp];
     UIImageView*imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 90, 90)];
     NSData *imageData;
     imageData=UIImageJPEGRepresentation(copyOfOriginalImager, 0.4);
     [imageView setImage:[UIImage imageWithData:imageData]];
  [cell.contentView addSubview:imageView];
  }
        failureBlock:^(NSError *error)
  {
     // error handling
     NSLog(@"failure-----");
    }];
  return cell;
  }

我在iOS 7中遇到很多问题,由于内存压力导致应用程序崩溃,请解释一下

3 个答案:

答案 0 :(得分:4)

它归因于assest库。一旦使用assest libary获取图像,只需将其存储在某个变量中,然后在

中重复使用该图像
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
滚动集合视图时,它将使用资产库反复获取图像,这将导致巨大的内存泄漏。

编辑:

 UIImage *img =[imageDictionary objectForKey:imageName];
                if(!img)
                {

                    NSURL *asseturl = [NSURL URLWithString:imageName];
                    img = [McAssetReader readImage:asseturl];
                    [imageDictionary setObject:img forKey:imageName];
                }

其中 imageDictionary 是用于保存图片的全局词典。 imageName 是特定图片的网址。

答案 1 :(得分:2)

您的代码存在两个问题:

  • 您不断将imageView添加到单元格中,甚至不检查是否已存在,因此内存使用量正在快速增长;

  • 你没有缓存你的图像转换结果并继续读取/转换每个单元格出列,因此你会对磁盘IO和内存施加压力;

缓存和重用技术很可能会解决您的问题。

答案 2 :(得分:2)

我可以在这里看到问题。肯定会导致内存错误。

UIImageView*imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 90, 90)];
.
.
.    
[cell.contentView addSubview:imageView];

看到这一行。您每次都在创建imageView并将该图像保存到imageview中。

所以你可以这样做,而不是第一行。

UIImageView *imageView = [cell.contentView viewWithTag:ImageViewTag];
if (!imageView)
{
    imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 90, 90)];
    [cell.contentView addSubview:imageView];
}