首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在发布后,CGImageRef也会使用大量内存。

即使在发布后,CGImageRef也会使用大量内存。
EN

Stack Overflow用户
提问于 2015-04-08 18:29:59
回答 2查看 305关注 0票数 0

我正在使用CGImageRef,并注意到它使用了许多没有被释放的内存。

所以我尝试用下面的代码做实验

代码语言:javascript
复制
- (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,并调用

代码语言:javascript
复制
CGImageRelease(fullResolutionImage);

当我到达UIImageOrientation时,我的应用程序使用不到30 my,但我一调用CGImageRef,它就超过了80 my。

这两种释放内存的方法只能让我获得50 me的内存,所以在某个地方还有另外20 me。

这些额外的20 are只有在整个方法完成后才会被释放。

那些额外的20 are从哪里来的?

在调用startUpload:之前,我如何释放它们?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2015-04-08 19:02:47

您不需要手动发布CGImageRef,作为一个旧的CF不透明类型,它遵循所有权的规则,只有在函数/方法名称中有创建或复制的情况下,您才需要关心内存管理。

关于您的问题,很难理解-startupload所做的事情以及您在何处调用-photoFromAsset。我的建议是,如果在循环中调用-photoFromAsset,则将循环中的内容包装在@autorelasePool中。

第二个可能是您的startUpload (我想这是在向服务器上传一些东西),它继续通过解压缩和发送到服务器来保持对映像本身的强烈引用。

为了避免这种情况,也为了避免打开大量的连接,我的建议是为网络操作创建一个队列,“一次”只发送两个图像。

票数 0
EN

Stack Overflow用户

发布于 2015-04-08 21:33:57

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

相反,为什么不立即将UIImage作为文件写入磁盘,这样您就可以将映像从内存中释放出来,而不是上传文件(从磁盘),而无需在内存中保存任何内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29522599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档