我一次在屏幕上有多个水平滚动的集合视图。他们都充满了图像。所有这些图像都是通过Parse api在后台加载的。我正在运行Instrument的分配和匿名VM:ImageIO_JPEG_DATA类占用了大部分正在使用的内存。应用程序中的所有内存大约等于40,然后此类别超过55,这使得总数在100左右。该类别永远不会下降,只是保持一致。如何从我的集合视图中的图像中释放这些内存?
以下是我的收藏视图的代码:
.m用于我的集合视图控制器
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath];
if (cell) {
[cell.loadingImageIndicator setHidden:NO];
[cell.loadingImageIndicator startAnimating];
id photo = [self.collectionViewPhotos objectAtIndex:indexPath.item];
if ([photo isKindOfClass:[PFObject class]]) {
PFObject *photoObject = (PFObject *)photo;
PFFile *imageFile = [photoObject objectForKey:kPhotoPictureKey];
[cell.cellImage setFile:imageFile];
[cell.cellImage loadInBackground:^(UIImage *image, NSError *error) {
[cell.cellImage setContentMode:UIViewContentModeScaleAspectFill];
[cell.loadingImageIndicator stopAnimating];
[cell.loadingImageIndicator setHidden:YES];
}];
} else if ([photo isKindOfClass:[UIImage class]]) {
[cell.cellImage setImage:photo];
[cell.cellImage setContentMode:UIViewContentModeScaleAspectFill];
}
}
return cell;
}
.m for CollectionViewCell
- (void)prepareForReuse
{
self.cellImage.image = nil;
}
- (void)dealloc
{
self.cellImage = nil;
}
编辑:乐器照片
答案 0 :(得分:4)
我在照片库类型的应用程序中遇到了同样的问题,并且在所谓的ImageIO_JPEG_DATA类别中遇到了相同的问题,累积并保留了#34; live"永远,导致我的应用程序内存不足。奇怪的是,这只发生在我正在测试的iPad上,而不是在ios模拟器上(没有显示内存问题)。
Brian的建议(下面)为我工作。我的应用程序最初使用的是一个数组,其中每个元素都包含一个UIImage。这些图像用于各种UIScrollViewControllers。
当我需要加载图片时,如果我使用
[UIImage imageWithContentsOfFile:path]
而不是直接引用我的数组中的UIImage,内存问题(由ImageIO_Malloc正在进行的一些无法解释的缓存引起)消失了,ImageIO_JPEG_DATA分配停止堆积并被释放。
在我自己的无数年里,我永远不会想出这个解决方案,所以感谢Brian。