Iphone 调用AlassetRepresentation';的元数据方法数百次将失败

Iphone 调用AlassetRepresentation';的元数据方法数百次将失败,iphone,ios,alassetslibrary,Iphone,Ios,Alassetslibrary,我正在编写一个微型iPhone应用程序,用于检索iPhone中存储的所有照片的元数据,如EXIF info,在调用资产库框架API时遇到了一个奇怪的问题。基本上,如果我调用ALAssetReprsentation的元数据方法(http://developer.apple.com/library/ios/documentation/AssetsLibrary/Reference/ALAssetRepresentation_Class/Reference/Reference.html#//apple

我正在编写一个微型iPhone应用程序,用于检索iPhone中存储的所有照片的元数据,如EXIF info,在调用资产库框架API时遇到了一个奇怪的问题。基本上,如果我调用ALAssetReprsentation的元数据方法(http://developer.apple.com/library/ios/documentation/AssetsLibrary/Reference/ALAssetRepresentation_Class/Reference/Reference.html#//apple_ref/occ/instm/ALAssetRepresentation/metadata)数百次(即使对于同一个AlasSetRepresentation对象),API将报告错误并返回null,而不是photo的元数据

以下是重现此问题的代码:

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);
}
阿拉塞特*照片=…/通过资产库框架获取照片资产 int i=0; ALAssetRepresentation*representation=[photo defaultRepresentation]; NSDictionary*元数据;
而(i可能是内存不足。方法
[representation metadata]
返回一个自动释放对象,并可能在执行时创建更多的自动释放对象。所有这些实例都添加到自动释放池,等待最终释放(及其内存释放)当ARP有机会耗尽自己时

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

无论是否使用ARC,这都是正确的

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

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

while(i在此输入代码)确保在访问完相关资产之前保留ALAssetLibrary。从Apple的文档:

从库实例返回的对象的生命周期是固定的 到库实例的生存期


您是否检查过是否存在内存问题?例如,使用仪器检查和/或在循环中使用额外的自动释放池。我使用的是ARC,您是否知道如果使用ARC,在何种情况下会出现内存问题?我将尽快尝试使用仪器进行分析(我还不熟悉仪器).Thank.ARC与此无关。如果在一个紧循环中分配了太多自动释放的对象,您仍然可能会耗尽内存。请尝试这样修改您的循环:
while(i@OleBegemann非常感谢这一点,它确实解决了我的问题。你能在下面用更多的细节解释一下吗?我会接受它作为这个问题的最终答案。这段代码不是我在我的应用程序中使用的真实代码,而是重现这个问题的一段最短代码。在我的应用程序中,有一个枚举器在我的应用程序中迭代所有照片资产库和it将导致我上面提出的相同问题。您提到“从性能角度来看,这不一定是最佳解决方案”,您能告诉我该问题的其他可能解决方案吗?
while (i<600) {
    @autoreleasepool {
        i++;
        metadata = [representation metadata];
        NSLog(@"photo %d indexed %@", i, metadata);
    }
}