首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIImagePNGRepresentation内存从未释放

UIImagePNGRepresentation内存从未释放
EN

Stack Overflow用户
提问于 2014-03-20 00:10:40
回答 1查看 925关注 0票数 0

我意识到以前有人问过这个问题,但是我没有找到任何真正解决这个问题的答案,so...asking。

我在用ARC。我的应用程序定期从AVCaptureSession上拍摄照片,并将它们保存到核心数据中。我通过调用NSData ()获得UIImagePNGRepresentation对象。随着这种情况的发生,内存稳步攀升,应用程序最终由于内存pressure...but而退出--没有泄漏。仪器显示,每一张照片都有500 K被调出,永远不会被释放。

我一直遇到的答案是将UIImagePNGRepresentation (实际上是整个方法体)包装在一个自动释放池中,但这并没有帮助。

我相当肯定UIImagePNGRepresentation调用是罪魁祸首,因为当我注释掉它时,不会再有内存问题(或要保存的图像)。

如果有什么帮助的话,here...is可以用其他方法从UIImage中获取NSData吗?这仅仅是我们必须面对的另一个SDK bug吗?

代码语言:javascript
复制
-(void)photoTimerFired:(NSTimer*)timer
{

...

ManagedDataPoint *lastPoint = [_currentSession.dataPoints lastObject];

_lastImage = [_imageCapturer singleImage];


Photo *newPhoto = [NSEntityDescription insertNewObjectForEntityForName:@"Photo"
inManagedObjectContext:self.managedObjectContext];

// Line below is the culprit.
newPhoto.photoData = UIImagePNGRepresentation(_lastImage);
newPhoto.managedDataPoint = lastPoint;

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-20 00:47:50

我认为,在您的例子中,CoreData编程指南的这一页 值得阅读,在使用BLOB(二进制数据)(如CoreData中的图像)时,您需要注意尽量减少开销。

特别是当他们谈到创建一个专门的实体,只保存您的二进制属性/图像,将其与主实体的其他属性分离,并允许它“出错”时,这样它只会在实际引用/使用属性时从数据库加载到内存中。

另一件要尝试的事情是,在保存图像的实体的二进制属性上选中"Use“复选框。这样,在实践中,映像实际上不会被直接保存到sqlite数据库中,而是保存在外部文件中,该属性只保存对该外部文件的引用(路径),从而限制了数据库的增长(并且随着基础的大小增加,会有损坏的风险)。(希望它还能减少内存占用,避免在NSManagedObject出现时将映像保存在内存中,而不会出错.?)

注意:对于代码中这个属性的使用,所有这些“外部存储”都是完全透明的:您仍然访问它,就好像该属性直接包含二进制数据一样。

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

https://stackoverflow.com/questions/22520858

复制
相关文章

相似问题

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