iphone - NSMutablearray 中的奇怪 NSRangeException 超出范围错误

标签 iphone ios objective-c nsmutablearray nsrangeexception

在我的应用中,我正在进行音频分析。 每一秒,我都在调用一些方法,比如这个:

- (NSNumber *) arrayAverage: (NSMutableArray *)array
{
    int countArray = [array count];

    if(!countArray)
        return nil;

    else if (countArray <= 5 )
        return [array valueForKeyPath:@"@avg.doubleValue"];

    else
    {
        // Création et initialisation d'un tableau temporaire
        NSMutableArray *averageArray = [[NSMutableArray alloc] initWithArray:array];
        NSSortDescriptor* desc = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
        [averageArray sortUsingDescriptors:[NSArray arrayWithObject:desc]];


        for (int j = 0; j < countArray / 3; j++)
        {
            [averageArray removeLastObject];
            [averageArray removeObjectAtIndex:0];
        }


        NSNumber * average = [averageArray valueForKeyPath:@"@avg.doubleValue"];


        return average;
        }

}

问题是我有时会收到一个 NSRangeException 错误(1 分钟或几个小时后......这取决于......)说数组索引超出范围。奇怪的是索引没有越界...... 这些方法只在主线程上调用。 提前感谢您的帮助!

编辑 1: 在 Anim 和 Abhinav 的帮助下,我更改了我的代码如下。 它已经工作了超过 2 小时 45 分钟(这是一个记录),然后因 EXC_BAD_ACCESS 代码 1 错误而崩溃...

- (NSNumber *) arrayAverage: (NSMutableArray *)array
{
    NSArray *arrayCopy = [[NSArray alloc] initWithArray:array]; // CRASH with EXC_BAD_ACCESS error

    int countArray = [arrayCopy count];

    if(!countArray)
        return nil;

    else if (countArray <= 5 )
        return [arrayCopy valueForKeyPath:@"@avg.doubleValue"];

    else
    {
        // Création et initialisation d'un tableau temporaire
        NSMutableArray *averageArray = [[NSMutableArray alloc] initWithArray:arrayCopy];
        NSSortDescriptor* desc = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
        [averageArray sortUsingDescriptors:[NSArray arrayWithObject:desc]];

        int startOfRange = countArray / 3;
        int rangeLength = countArray - 2 * (countArray / 3);

        NSArray* slicedArray = [averageArray subarrayWithRange:NSMakeRange(startOfRange, rangeLength)];

        NSNumber * average = [slicedArray valueForKeyPath:@"@avg.doubleValue"];

        return average;
    }

}

最佳答案

对于给定的一段代码,它会更多地猜测这里发生了什么。请确保以下内容:

  1. 在调用“removeLastObject”或“removeObjectAtIndex”之前,检查数组计数是有意义的。只有在有东西要移除时才调用他们。
  2. 鉴于 NSArray 和 NSMutableArray 不是线程安全的,请确保您正在操作的数组不会同时被修改和使用。

我想在您的 For 循环中引入以下语句:

if (averageArray.count > 0) {
    [averageArray removeLastObject];
}

if (averageArray.count > 0) {
    [averageArray removeObjectAtIndex:0];
}

关于iphone - NSMutablearray 中的奇怪 NSRangeException 超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19479961/

相关文章:

ios - 如何在单击按钮期间在 ScrollView 中添加数组元素

ios - 对于用 Swift 编写的 64 位应用程序,我需要做一些特殊的事情吗?

ios - 使用 xCode 创建应用程序 ID

ios - 将 Obj-C 函数完成处理程序代码转换为 Swift 2.0 时出错

iphone - 还想用滑动状态栏实现滑动侧边菜单。在 iOS 中

html - 如何在 iPhone 5 网络应用程序上显示我的自定义 CSS?

iphone - iPod 中的重要位置更改通知

iphone - 如何处理动态 UITableView 中对 UITextFields 的引用 (iPhone)

objective-c - 隐藏滚动条,同时在 NSScrollView 中启用滚动本身

iphone - 比较 Cell 的 indexpath 和 uiButton 这可能吗?