- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我意识到之前有人问过这个问题,但我没有找到任何真正解决它的答案,所以......再问一次。
我正在使用 ARC。我的应用程序定期从 AVCaptureSession 中拍摄照片并将它们保存到核心数据中。我通过调用 UIImagePNGRepresentation() 获得 NSData 对象。随着这种情况的发生,内存稳步攀升,应用程序最终由于内存压力而退出......但没有泄漏。 Instruments 显示,对于每张照片,500k 被分配并且从未被释放。
我不断遇到的答案是将 UIImagePNGRepresentation 或整个方法主体包装在自动释放池中,但这没有帮助。
我有理由确定 UIImagePNGRepresentation 调用是罪魁祸首,因为当我注释掉它时,不再有内存问题(或要保存的图像)。
在此希望得到任何帮助...是否有另一种从 UIImage 中获取 NSData 的方法?这只是我们不得不忍受的另一个 SDK 错误吗?
-(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;
}
最佳答案
我认为 this page of the CoreData Programming Guide在您的情况下值得一读,讨论在使用 BLOB 时需要注意的事项以尽量减少开销(二进制数据),例如 CoreData 中的图像。
特别是当他们谈论创建一个专门的实体来只保存你的二进制属性/图像时,将它与你的主要实体的其他属性分开并允许它“出错”,这样它只会从数据库中加载当属性被实际引用/使用时进入内存。
要尝试的另一件事是选中保存图像的实体的二进制属性上的“使用外部存储”复选框。这种方式在实践中实际上不会将图像直接保存为 BLOB 直接保存在您的 sqlite 数据库中,而是保存在外部文件中,该属性仅包含对该外部文件的引用(路径),限制了您的增长数据库(随着数据库规模的扩大,存在腐败风险)。(希望当 NSManagedObject
存在并且没有错误时,它也可以通过避免将图像保存在内存中来减少内存占用...?)
注意:对于代码中此属性的使用,所有这些“外部存储”内容对您来说都是完全透明的:您仍然可以访问它,就好像该属性直接包含二进制数据一样。
关于ios - UIImagePNGRepresentation 内存从未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520858/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!