Аудио очередь и EXC_BAD_ACCESS

это мой код для создания шума с использованием Audio Queue:

http://pastebin.com/Kn8GU72J

Проблема в том, что мой код генерирует EXC_BAD_ACCESS. Проблема видимо в задании

    MAAudioManager *audioMngr = (__bridge MAAudioManager *) inUserData;

в процедуре обратного вызова. Я подозреваю, что это может быть связано с доступом потока класса MAAudioManager.

Любая идея?


person Carlo    schedule 17.01.2012    source источник


Ответы (1)


Есть ли что-то еще в программе, сохраняющее экземпляр MAAudioManager? Похоже, что к моменту вызова обратного вызова он был освобожден.

person joerick    schedule 17.01.2012
comment
Ты прав. Та же программа без ARC работает нормально. Кажется, что ARC выпускает экземпляр MAAudioManager. Хорошо, мне нужно немного лучше изучить ARC. Между тем, есть идеи о том, как я могу избежать того, что ARC освобождает объект? Благодарность! - person Carlo; 17.01.2012
comment
Вам нужно где-то сохранить указатель на экземпляр MAAudioManager. Вы можете сохранить его в переменной экземпляра объекта, который его создает, или, например, в делегате приложения. - person joerick; 18.01.2012
comment
Также рекомендуется выполнять отладку с включенным NSZombie, вы можете сделать это в диалоговом окне «Схема», параметр называется «Включить объекты-зомби». Если это включено, вы получите больше информации, а не только EXC_BAD_ACCESS. - person joerick; 18.01.2012
comment
На самом деле уже есть MAAudioManager *audio = [[MAAudioManager alloc] init]; в делегате приложения. Наверное, я что-то упускаю. - person Carlo; 18.01.2012
comment
Это локальная переменная. Как только метод завершается, переменная выходит за пределы области видимости и удаляется. Вот почему ARC выпускает ваш объект. Вам нужно объявить audio как переменную экземпляра, что означает объявить ее в разделе @interface делегата вашего приложения (в заголовочном файле), например MAAudioManager *audio. Объявленная там переменная будет существовать до тех пор, пока существует объект, что для делегата приложения является временем жизни приложения. Затем вы можете заменить строку, которую вы разместили, на audio = [[MAAudioManager alloc] init]. - person joerick; 18.01.2012
comment
Вы определенно правы. Спасибо за ваше любезное объяснение. - person Carlo; 18.01.2012