Иногда происходит сбой EXC_BAD_ACCESS без сообщения (установите NSZombieEnabled)

Я работаю с RemoteIO, чтобы получить микрофонные входы и немного их изменить.

Иногда происходит сбой с EXC_BAD_ACCESS и больше нет сообщений.

Вот те линии, которые вызывают сбои;

  int currPower = [[powers objectAtIndex:i] intValue];
  int prevPower = [[powers objectAtIndex:i - 1] intValue];

объясняя код,

  1. "полномочия" это NSMutableArray,
  2. [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);

Другие вопросы по тегам