我意识到之前已经问过这个问题,但我找不到任何能够解决问题的答案,所以......再次提问。
我使用ARC。我的应用程序定期从AVCaptureSession拍摄照片并将其保存到核心数据中。我通过调用UIImagePNGRepresentation()获取NSData对象。随着这种情况的发生,内存稳步攀升,应用程序最终因内存压力而退出......但没有泄漏。仪器显示,对于每张照片,500k正在被拍摄,并且它永远不会被释放。
我经常遇到的答案是将UIImagePNGRepresentation或整个方法体包装在autoreleasepool中,但这没有帮助。
我有理由相信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;
}
答案 0 :(得分:1)
我认为 this page of the CoreData Programming Guide值得一读,在讨论需要注意的事项,以便在使用BLOB时减少开销(二进制数据) CoreData中的图像。
特别是当他们谈论创建专用实体以仅保存二进制属性/图像,将其与主要实体的其他属性分离并允许其“故障”时的部分,以便它只会从数据库加载实际引用/使用属性时进入内存。
要尝试的另一件事是检查保存图像的实体的二进制属性上的“使用外部存储”复选框。这种方式在实践中,图像实际上不会直接保存在sqlite数据库中作为BLOB,而是保存在外部文件中,该属性只保留对该外部文件的引用(路径),从而限制了数据库(以及基数增长时的腐败风险)。
(希望它还能减少你的内存占用,避免在NSManagedObject
出现时将图像保留在内存中而不是故障......?
注意:对于您在代码中使用此属性,所有这些“外部存储”内容都完全透明:您仍然可以访问它,就好像该属性直接包含二进制数据一样。