我意识到以前有人问过这个问题,但是我没有找到任何真正解决这个问题的答案,so...asking。
我在用ARC。我的应用程序定期从AVCaptureSession上拍摄照片,并将它们保存到核心数据中。我通过调用NSData ()获得UIImagePNGRepresentation对象。随着这种情况的发生,内存稳步攀升,应用程序最终由于内存pressure...but而退出--没有泄漏。仪器显示,每一张照片都有500 K被调出,永远不会被释放。
我一直遇到的答案是将UIImagePNGRepresentation (实际上是整个方法体)包装在一个自动释放池中,但这并没有帮助。
我相当肯定UIImagePNGRepresentation调用是罪魁祸首,因为当我注释掉它时,不会再有内存问题(或要保存的图像)。
如果有什么帮助的话,here...is可以用其他方法从UIImage中获取NSData吗?这仅仅是我们必须面对的另一个SDK bug吗?
-(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;
}发布于 2014-03-20 00:47:50
我认为,在您的例子中,CoreData编程指南的这一页 值得阅读,在使用BLOB(二进制数据)(如CoreData中的图像)时,您需要注意尽量减少开销。
特别是当他们谈到创建一个专门的实体,只保存您的二进制属性/图像,将其与主实体的其他属性分离,并允许它“出错”时,这样它只会在实际引用/使用属性时从数据库加载到内存中。
另一件要尝试的事情是,在保存图像的实体的二进制属性上选中"Use“复选框。这样,在实践中,映像实际上不会被直接保存到sqlite数据库中,而是保存在外部文件中,该属性只保存对该外部文件的引用(路径),从而限制了数据库的增长(并且随着基础的大小增加,会有损坏的风险)。(希望它还能减少内存占用,避免在NSManagedObject出现时将映像保存在内存中,而不会出错.?)
注意:对于代码中这个属性的使用,所有这些“外部存储”都是完全透明的:您仍然访问它,就好像该属性直接包含二进制数据一样。
https://stackoverflow.com/questions/22520858
复制相似问题