在我的应用中,我正在进行音频分析。 每一秒,我都会调用一些方法,比如这个:
- (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;
}
}
答案 0 :(得分:2)
使用给定的代码片段,它会更多地猜测这里发生了什么。请确保以下内容:
我想在For循环中引入以下语句:
if (averageArray.count > 0) {
[averageArray removeLastObject];
}
if (averageArray.count > 0) {
[averageArray removeObjectAtIndex:0];
}
答案 1 :(得分:0)
你可以再做一件事,只需在循环前添加一个条件: 这是片段,添加了评论:
- (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]];
if ([array count] > 0) //Added one condition here---PR Singh
{
for (int j = 0; j < countArray / 3; j++)
{
[averageArray removeLastObject];
[averageArray removeObjectAtIndex:0];
}
}
NSNumber * average = [averageArray valueForKeyPath:@"@avg.doubleValue"];
return average;
}
}