Я работаю с RemoteIO, чтобы получить микрофонные входы и немного их изменить.
Иногда происходит сбой при EXC_BAD_ACCESS
, и сообщения больше нет.
Эти строки вызывают сбои;
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
объясняя код,
- "Сила" - это
NSMutableArray
.
[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 {..}