иногда происходит сбой EXC_BAD_ACCESS без сообщения (установите NSZombieEnabled) - PullRequest
0 голосов
/ 03 февраля 2012

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

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

Эти строки вызывают сбои;

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

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

  1. "Сила" - это NSMutableArray.
  2. [powers count] всегда был больше , чем переменная "i"

Поработав некоторое время, я нашел хороший способ исправить это.

Переменные окружения.

Поэтому я установил NSZombieEnabled, а также NSDebugEnabled, чтобы я мог видеть причину аварий.

Но даже если я установил переменные, Xcode не показывает сообщения. (Но он правильно показывает сообщения, когда происходит сбой с другой строки.)

Также странно то, что он не падает сразу после запуска; в среднем он падает за минуту. (Но времена действительно менялись.)

И это небольшая догадка. Когда я снизил скорость до половины, чем раньше, это было более стабильным.

Итак, это проблема с NSMutableArray, потому что метод NSMutableArray не может догнать скорость скорости?

или вы видите другие возможные причины?

=============================================== ==========================================

Есть еще несколько кодов. Я распределил полномочия таким образом ..

  powers = [[NSMutableArray alloc] initWithCapacity:POWER_ARRAY_SIZE];

где я освобождаю массив powers ..

  - (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 ]

0 голосов
/ 15 февраля 2012

Я нашел ответ.

Сбои происходят из-за неправильного подтверждения NSMutableArray объекта objected-C.

Вот когда я пытаюсь что-то делать с этим каждые миллисекунды.

Итак, я изменил массив Objective C на массив C, например

  int power[ARRAYSIZE];

и после того, как я его изменил, он работает нормально.

Может быть, NSMutableArray не настолько легок, чтобы сделать что-то действительно быстрое.

0 голосов
/ 03 февраля 2012

Если NSZombies решил вашу проблему, это означает, что ваш NSMutableArray куда-то выпускается или находится в пуле авто-релиза. Также вы можете пытаться писать за пределами вашего массива.

  • Если NSMutableArray находится в пуле автоматического выпуска (он был создан удобным способом или вы явно autorelease d) вручную retain it и release его, когда он больше не нужен.
  • Если объект не находится в пуле автоматического выпуска, проверьте, когда для этого объекта вызывается release.
  • Напишите простое предупреждение перед назначением:

if( i <= 0 || i >= [powers count] ) NSLog(@"Here's the problem. i = %d", i);

...