【发布时间】: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