我正在使用 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之前释放它们?
谢谢
答案 0 :(得分:0)
你不需要手动释放CGImageRef,作为旧的CF opaque类型,它遵循ownership的规则,只有在函数/方法名称中有创建时才需要关心内存管理或复制。
关于您的问题很难理解-startupload
的作用以及您拨打-photoFromAsset
的位置。我的建议是,如果在循环中调用-photoFromAsset
,请在@autorelasePool中包含循环内部的内容。
第二个可能是你的startUpload(我想是将内容上传到服务器),它继续通过解压缩并发送到服务器来保持对图像本身的强引用。
为避免这种情况,为了避免打开大量连接,我的建议是为网络操作创建一种队列,并立即发送2张图像"#34;。
答案 1 :(得分:0)
您的问题似乎都源于您上传的图像(UIImage)在内存中 (变量fullImage
,在您引用的代码中注释掉) 。这似乎是一个非常愚蠢的事情:图像很大,上传需要时间,所以你强制你的程序将整个图像保存在内存中,只要上传它就可以了。
相反,为什么不立即将 UIImage作为文件写入磁盘,这样你可以放弃内存中的图像,而是上传< em> file (来自磁盘),没有在内存中保存任何