UIImagePNGRepresentation内存从未发布

时间:2014-03-20 00:10:40

标签: ios objective-c uiimage nsdata

我意识到之前已经问过这个问题,但我找不到任何能够解决问题的答案,所以......再次提问。

我使用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;

}

1 个答案:

答案 0 :(得分:1)

我认为 this page of the CoreData Programming Guide值得一读,在讨论需要注意的事项,以便在使用BLOB时减少开销(二进制数据) CoreData中的图像。

特别是当他们谈论创建专用实体以仅保存二进制属性/图像,将其与主要实体的其他属性分离并允许其“故障”时的部分,以便它只会从数据库加载实际引用/使用属性时进入内存。


要尝试的另一件事是检查保存图像的实体的二进制属性上的“使用外部存储”复选框。这种方式在实践中,图像实际上不会直接保存在sqlite数据库中作为BLOB,而是保存在外部文件中,该属性只保留对该外部文件的引用(路径),从而限制了数据库(以及基数增长时的腐败风险)。 (希望它还能减少你的内存占用,避免在NSManagedObject出现时将图像保留在内存中而不是故障......?

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