gpt4 book ai didi

ios - UIImagePNGRepresentation 内存从未释放

转载 作者:行者123 更新时间:2023-11-29 03:08:20 29 4
gpt4 key购买 nike

我意识到之前有人问过这个问题,但我没有找到任何真正解决它的答案,所以......再问一次。

我正在使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com