我正在使用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时,我的应用程序使用不到30 my,但我一调用CGImageRef,它就超过了80 my。
这两种释放内存的方法只能让我获得50 me的内存,所以在某个地方还有另外20 me。
这些额外的20 are只有在整个方法完成后才会被释放。
那些额外的20 are从哪里来的?
在调用startUpload:之前,我如何释放它们?
谢谢
发布于 2015-04-08 19:02:47
您不需要手动发布CGImageRef,作为一个旧的CF不透明类型,它遵循所有权的规则,只有在函数/方法名称中有创建或复制的情况下,您才需要关心内存管理。
关于您的问题,很难理解-startupload所做的事情以及您在何处调用-photoFromAsset。我的建议是,如果在循环中调用-photoFromAsset,则将循环中的内容包装在@autorelasePool中。
第二个可能是您的startUpload (我想这是在向服务器上传一些东西),它继续通过解压缩和发送到服务器来保持对映像本身的强烈引用。
为了避免这种情况,也为了避免打开大量的连接,我的建议是为网络操作创建一个队列,“一次”只发送两个图像。
发布于 2015-04-08 21:33:57
您的问题似乎都源于这样一个事实:您正在上传一个存储在内存中的图像( UIImage) (变量fullImage,在您引用的代码中注释掉)。这似乎是一件非常愚蠢的事情:图像是巨大的,上传需要时间,所以你强迫你的程序将整个图像保存在内存中,只要上传需要时间。
相反,为什么不立即将UIImage作为文件写入磁盘,这样您就可以将映像从内存中释放出来,而不是上传文件(从磁盘),而无需在内存中保存任何内容。
https://stackoverflow.com/questions/29522599
复制相似问题