【问题标题】:NSRangeException using -[ALAssetsGroup enumerateAssetsUsingBlock:]NSRangeException 使用 -[ALAssetsGroup enumerateAssetsUsingBlock:]
【发布时间】:2011-11-28 19:08:19
【问题描述】:

我目前正在使用一些非常标准的代码来枚举组中的资产。除了现在我有一个新错误

*** 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 永远不会被触发,它告诉我枚举代码存在我无法控制的问题。有其他人经历过吗?

【问题讨论】:

  • 你为什么调用[asset autorelease]而不是[asset release](因为它被assetGroup数组保留)?对我来说,这似乎是一个潜在的崩溃。
  • ALAsset 被命名为结果。资产对象是由我的提供者使用 newAsset 创建的。并且按照正常惯例,我使用以 new 开头的方法获得了保留计数。这个对象在我的数据库中。很抱歉造成混乱。
  • @MichaelDautermann:调用-autorelease 而不是-release 永远是不正确的
  • 调用自动释放并不是“错误的”。但更好的选择是简单地释放您创建并完成的对象。我已更新代码以释放创建的对象。

标签: ios alassetslibrary nsrangeexception


【解决方案1】:

可以通过将过滤器设置为照片、视频并依次枚举每个过滤器来规避此错误,而不是将其保留在默认的“资产”中。

我在这里发布了详细信息:ALAssetsLibrary seems to return wrong number of my photos

【讨论】:

    【解决方案2】:

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

    他们在单独的线程中执行枚举块并崩溃超出范围。多可惜!我什至找不到办法抓住这个。应用程序崩溃,在他们的库自行修复之前您无能为力。

    修改相机胶卷或有时启动 iPhoto for iPad 可以解决问题,但它会再次出现。幸运的是,这种情况不会经常发生,但 Apple 必须对此做出反应。

    【讨论】:

      【解决方案3】:

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

      当然希望我知道实际问题是什么以及为什么 AssetsLibrary 尝试枚举越界。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        • 2013-02-07
        • 1970-01-01
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多