iphone - 调用 ALAssetReprsentation 的元数据方法几百次都会失败

标签 iphone ios alassetslibrary

我正在编写一个小型 iPhone 应用程序来检索存储在 iPhone 中的所有照片的元数据,例如 EXIF 信息,并且在调用 Assets Library Framework API 时遇到了一个奇怪的问题。基本上,如果我正在调用 ALAssetRepresentation 的元数据方法数百次(即使是同一个 ALAssetReprsentation 对象),API 将报告错误并返回 null 而不是照片的元数据。

这是重现此问题的代码:

ALAsset *photo = ... // fetch a photo asset via Assets Library Framework
int i = 0;
ALAssetRepresentation *representation = [photo defaultRepresentation];
NSDictionary *metadata;
while (i<600) {
    i++;
    metadata = [representation metadata];
    NSLog(@"photo %d indexed %@", i, metadata);
}

这是上面代码的输出。开始输出时一切正常,但超过500次后,元数据API会报错“ImageIO: CGImageSourceCreateWithData data parameter is nil”。

...
2011-12-29 21:46:17.106 MyApp[685:707] photo 578 indexed {
ColorModel = RGB;
DPIHeight = 72;
DPIWidth = 72;
...
}
...
ImageIO: <ERROR>  CGImageSourceCreateWithData data parameter is nil
2011-12-29 21:46:17.151 MyApp[685:707] photo 579 indexed (null)
ImageIO: <ERROR>  CGImageSourceCreateWithData data parameter is nil
2011-12-29 21:46:17.177 MyApp[685:707] photo 580 indexed (null)

我正在使用 iOS 5.0.1 的 iPhone 3GS 进行测试。我正在使用启用了 ARC(自动引用计数)的 Xcode 4.2 进行开发。而且我只能在将应用程序部署到 iPhone 3GS 设备时重现此问题,但在使用具有相同代码的 iOS 模拟器时无法重现此问题(至少我在 iOS 模拟器中调用 API 超过 1800 次后不会重现此问题).

感谢任何帮助。谢谢。

最佳答案

您可能内存不足。 [representation metadata] 方法返回一个自动释放对象,并可能在执行时创建更多自动释放对象。所有这些实例都被添加到自动释放池中,等待在 ARP 有机会耗尽自身时最终释放(并释放它们的内存)。

问题是,在您的代码将控制权返回给运行循环之前,这不会发生。因此,在循环期间,至少有 600 个大型字典(可能还有更多对象)最终被分配而不是被释放。根据这些对象的大小,内存使用量可能会大大增加。

无论您是否使用 ARC,都是如此。

为避免此问题,请尝试在循环的每次迭代中创建一个新的自动释放池。这样,ARP 在每次迭代中都会被耗尽:

while (i<600) {
    @autoreleasepool {
        i++;
        metadata = [representation metadata];
        NSLog(@"photo %d indexed %@", i, metadata);
    }
}

从性能的角度来看,这不一定是最佳解决方案,但至少它会告诉您问题是否与内存相关。

PS:您的代码目前没有多大意义。为什么要连续 600 次检索相同 Assets 的元数据?

关于iphone - 调用 ALAssetReprsentation 的元数据方法几百次都会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669336/

相关文章:

iphone - 应用程序再次激活后如何刷新 UITableView?

iphone - 使用事件指示器和标签显示警报(可变)

ios - iPad 屏幕尺寸返回错误值

iphone - 从 iPhone 相册导入和保存照片的正确方法是什么?

iphone - 在 iPhone 的照片库中写入 UIImage 以及元数据(EXIF、GPS、TIFF)

iphone - 我如何从字典字典中获取数组中的值

ios - Parse 中的指针 (ios)

ios - Xcode View 层次结构调试器 - "prototyping"

ios - NSError 版本 : message sent to deallocated instance

iOS:如何监听照片的变化和相册的变化