Иногда происходит сбой EXC_BAD_ACCESS без сообщения (установите NSZombieEnabled)
Я работаю с RemoteIO, чтобы получить микрофонные входы и немного их изменить.
Иногда происходит сбой с EXC_BAD_ACCESS
и больше нет сообщений.
Вот те линии, которые вызывают сбои;
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
объясняя код,
- "полномочия" это
NSMutableArray
, [powers count]
всегда был больше, чем переменная "я"
Поработав некоторое время, я нашел хороший способ это исправить.
Переменные среды.
Итак, я установил NSZombieEnabled
а также NSDebugEnabled
чтобы я мог видеть причину сбоев.
Но даже если я установил переменные, Xcode не показывает сообщения. (Но он правильно показывает сообщения, когда происходит сбой с другой строки.)
Также странным является то, что он не падает сразу после запуска; в среднем он падает за минуту. (Но времена действительно менялись.)
И это небольшая догадка. Когда я снизил скорость до половины, чем раньше, она стала более стабильной.
Итак, это проблема с NSMutableArray
, так как NSMutableArray
метод не мог догнать скорость?
или вы видите другие возможные причины?
================================================== =======================================
Есть еще несколько кодов. Я распределил полномочия таким образом..
powers = [[NSMutableArray alloc] initWithCapacity:POWER_ARRAY_SIZE];
где я освобождаю массив мощностей..
- (void)dealloc {
[powers release];
[super dealloc];
}
и не где еще.
более подробный код это.
- (void)drawRect:(CGRect)rect
{
...//Do Something
...//Check "endindex" and "startindex" not to exceed boundary
for (int i = endindex; i > startindex; i-=1)
{
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
...//Doing something
}
}
этот метод drawRect: вызывается из основного потока (по таймеру) каждую миллисекунду.
- обновление (в частности, добавление) полномочий в этом методе
- (void)setPower:(int)p
{
[powers addObject:[NSNumber numberWithInt:p]];
while ([powers count] > POWER_ARRAY_SIZE){
[powers removeObjectAtIndex:0];
}
}
а также этот метод вызывается каждую миллисекунду. и это вызывает в фоновом потоке.
так без @autoreleasepool XCode показывает сообщение о предупреждении утечки
по этой причине я заблокировал метод (setPower) с помощью @autoreleasepool{..}
2 ответа
Я нашел ответ.
Сбои происходят потому, что NSMutableArray объекта objected-C иногда ошибается.
Вот тогда я пытаюсь что-то делать с этим каждые миллисекунды.
Поэтому я изменил массив Objective-C на массив C, как
int power[ARRAYSIZE];
и после того, как я изменил его, он работает нормально.
Может быть, NSMutableArray не настолько легок, чтобы сделать что-то действительно быстрое.
Если NSZombies решили вашу проблему, значит, ваша NSMutableArray
где-то выпускается или находится в пуле авто-релиза. Также вы можете пытаться писать за пределами вашего массива.
- Если
NSMutableArray
находится в пуле автоматического выпуска (он был создан для удобства или вы явноautorelease
г) вручнуюretain
это иrelease
это когда тебе это больше не нужно. - Если объект не находится в пуле автоматического выпуска, проверьте, когда
release
вызывается для этого объекта. - Напишите простое предупреждение перед назначением:
if( i <= 0 || i >= [powers count] ) NSLog(@"Here's the problem. i = %d", i);