CGImageRef即使在发布后也会占用大量内存

时间:2015-04-08 18:30:00

标签: ios memory nsautoreleasepool cgimageref

我正在使用 CGImageRef 并注意到它使用了大量未被释放的内存。
所以我尝试了以下代码

- (void)photofromAsset:(ALAsset *)asset completion:(void(^)(NSError *error))completionHandler
    ALAssetRepresentation *representation = asset.defaultRepresentation;
    UIImageOrientation orientation = (UIImageOrientation)representation.orientation;
    CGImageRef fullResolutionImage = representation.fullResolutionImage;

    //UIImage *fullImage = [UIImage imageWithCGImage:fullResolutionImage scale:0.0 orientation:orientation];
    //[self startUpload:fullImage completion:completionHandler];
}

放入一些断点并将前三行代码放在@autorelease池中 然后尝试删除@autorelease并调用

CGImageRelease(fullResolutionImage);

当我进入 UIImageOrientation 时,我的应用程序使用的内容少于30MB 但是当我打电话给 CGImageRef 时,它会超过80MB 这两种内存释放方法只能让我达到50MB,所以在某处有额外的20MB 只有在整个方法完成后才会释放额外的20MB。

那些额外的20MB来自哪里?
如何在调用startUpload之前释放它们?

谢谢

2 个答案:

答案 0 :(得分:0)

你不需要手动释放CGImageRef,作为旧的CF opaque类型,它遵循ownership的规则,只有在函数/方法名称中有创建时才需要关心内存管理或复制。
关于您的问题很难理解-startupload的作用以及您拨打-photoFromAsset的位置。我的建议是,如果在循环中调用-photoFromAsset,请在@autorelasePool中包含循环内部的内容。
第二个可能是你的startUpload(我想是将内容上传到服务器),它继续通过解压缩并发送到服务器来保持对图像本身的强引用。
为避免这种情况,为了避免打开大量连接,我的建议是为网络操作创建一种队列,并立即发送2张图像"#34;。

答案 1 :(得分:0)

您的问题似乎都源于您上传的图像(UIImage)在内存中 (变量fullImage,在您引用的代码中注释掉) 。这似乎是一个非常愚蠢的事情:图像很大,上传需要时间,所以你强制你的程序将整个图像保存在内存中,只要上传它就可以了。

相反,为什么不立即 UIImage作为文件写入磁盘,这样你可以放弃内存中的图像,而是上传< em> file (来自磁盘),没有在内存中保存任何