2011-11-28 53 views
2

我目前使用一些非常标准的代码来枚举组中的资产。除了现在我有一个新的错误NSRangeException using - [ALAssetsGroup enumerateAssetsUsingBlock:]

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSOrderedSet enumerateObjectsAtIndexes:options:usingBlock:]: index 46 beyond bounds [0 .. 45]' 

这是我使用的代码。

[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
      NSLog(@"Asset %@", result); 
      if (result != nil) 
      { 
       Asset *asset = [provider newAsset]; 
       asset.date = [result valueForProperty:ALAssetPropertyDate]; 
       id duration = [result valueForProperty:ALAssetPropertyDuration]; 
       asset.duration = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", duration]]; 
       CLLocation *location = [result valueForProperty:ALAssetPropertyLocation]; 
       asset.location = [location description]; 
       asset.orientation = [result valueForProperty:ALAssetPropertyOrientation]; 
       asset.type = [result valueForProperty:ALAssetPropertyType]; 
       NSDictionary *urls = [result valueForProperty:ALAssetPropertyURLs]; 
       for (NSString * key in urls) { 
        NSLog(@"Url = %@",[urls objectForKey:key]); 
        asset.url = [NSString stringWithFormat:@"%@", [urls objectForKey:key]]; 
       } 

       [assetGroup addAssetsObject:asset]; 

       [asset release]; // Corrected based on comments 

      } 
     }]; 

提供者对象是我的自定义数据库提供者。但是消除这个代码并不好。 顶部NSLog永远不会被解雇,它告诉我枚举代码在我的控制之外有问题。有没有其他人经历过这个?

+0

你为什么叫'[资产自动释放]'而不是'[资产释放]'(因为它是由'assetGroup'阵列保留)?这对我来说似乎是一个潜在的不速之客。 ALASset被命名为结果 –

+0

。资产对象由我的提供者使用newAsset创建。并且按照惯例,我已经使用以新开始的方法给予保留计数。这个对象在我的数据库中。对困惑感到抱歉。 –

+0

@MichaelDautermann:调用'-autorelease'而不是'-release'永远不会错# – user102008

回答

-1

东西显然搞乱了我的照片库。清除我的照片并再次运行应用程序后,我不再遇到此问题。

当然希望我知道实际问题是什么,以及为什么AssetsLibrary试图枚举过Bounds。

0

我看到同样的问题。这是苹果方面的一个错误。

它们在一个单独的线程中执行枚举块并崩溃超出界限。多可惜!我找不到一种方法来解决这个问题。应用程序崩溃,并且没有什么可以做,直到他们的图书馆修复自己。

修改相机胶卷或有时启动iPhoto for iPad可以解决问题,但它会回来。幸运的是,它并不经常发生,但苹果必须对此做出反应。