在我的应用中,我正在进行音频分析。
每隔一秒钟,我就会调用一些方法,例如:

- (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;
    }

}

最佳答案

使用给定的代码片段,您将可以更多地猜测这里发生了什么。请确保以下内容:

  • 在调用“removeLastObject”或“removeObjectAtIndex”之前,有必要对数组计数进行检查。仅在有要删除的东西时才打电话给他们。
  • 鉴于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/

    10-11 02:54