我一次在屏幕上有多个水平滚动的 Collection View 。它们都充满了图像。所有这些图像都通过 Parse api 在后台加载。我正在运行 Instrument 的分配和匿名 VM:ImageIO_JPEG_DATA 类别占用了大部分正在使用的内存。应用程序中的所有内存大约等于 40,然后这个类别超过 55,总计大约 100。那个类别根本不会下降,只是保持一致。我可以做些什么来从我的收藏 View 中的图像中释放这些内存?
这是我的收藏 View 的代码:
.m 用于我的 Collection View Controller
- (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;
}
编辑:乐器照片
最佳答案
我在照片库类型的应用程序中遇到了同样的问题,并且在所谓的 ImageIO_JPEG_DATA 类别中的分配累积并永远保持“事件”时遇到了同样的问题,导致我的应用程序内存不足。奇怪的是,这只发生在我正在测试的 iPad 上,而不是在 ios 模拟器上(没有显示内存问题)。
Brian 的建议(如下)对我有用。我的应用程序最初使用一个数组,其中的每个元素都包含一个 UIImage。这些图像用于各种 UIScrollViewControllers。
当我需要加载图像时,如果我使用了
[UIImage imageWithContentsOfFile:path]
而不是直接引用我的数组中的 UIImage,内存问题(由 ImageIO_Malloc 正在执行的一些莫名其妙的缓存引起)消失了,ImageIO_JPEG_DATA 分配停止堆积并被释放。
我自己在数亿年的时间里永远也想不出这个解决方案,所以感谢 Brian。
关于ios - UIImage 内存未释放 VM : ImageIO_JPEG_DATA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574698/