AVAudioPlayer кидає точку розриву в режимі налагодження


108

Кожен раз, коли я завантажую програму, вона зупиняється так, ніби я встановив точку перерви на цій лінії:

self.audioPlayer = 
 [[[AVAudioPlayer alloc] initWithData:[dataPersister loadData:self.fileName] 
                                error:&outError] autorelease];

Біля цієї лінії немає точки перерви вище або будь-якого місця. Це трапляється лише тоді, коли я запускаю додаток у режимі налагодження, і нічого не виходить з ладу після точки розриву. Додаток працює так, як нічого не сталося, коли я натискаю "Продовжити виконання програми".

Це метод loadData, який називається за допомогою initWithData:

-(NSData*)loadData:(NSString*)fileName
{
    NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
    dataPath = [dataPath stringByStandardizingPath];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
    return data;
}

Функція loadData, здається, працює нормально. Запитаний mp3-файл завантажується та відтворюється без проблем після точки перерви.

Чи маєте ви поняття, що я роблю неправильно?

EDIT: Я запустив зворотній слід, коли він зупиняється на точці розриву. Це був вихід:

(lldb) bt
* нитка №1: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw, причина зупинки = точка відключення 1,2
    кадр № 0: 0x30df1724 libc ++ abi.dylib`__cxa_throw
    кадр №1: 0x36403a24 AudioToolbox`ID3ParserHandle :: ID3ParserHandle (void *, long (*) (void *, unsigned long, unsigned long, unsigned long, void **, unsigned long *)) + 452
    кадр №2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    кадр №3: 0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags () + 58
    кадр №4: 0x3635b9aa AudioToolbox`MPEGAudioFile :: ParseAudioFile () + 26
    frame # 5: 0x3631723e AudioToolbox`AudioFileObject :: DoOpenWithCallbacks (void *, long (*) (void *, long long, unsigned long, void *, unsigned long *), long (*) (void *, long long, unsigned long , void const *, unsigned long *), long long (*) (void *), long (*) (void *, long long)) + 166
    кадр № 6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    кадр № 7: 0x31f4c1ec AVFoundation`- [AVAudioPlayer initWithData: помилка:] + 120

"РІШЕННЯ": Виявляється, якщо я відключую точку перерви виключення для всіх винятків і використовую лише точку розриву для виключень Objective-C, проблема зникає. Але це не вирішує проблему, що при розподілі AVAudioPlayer є виняток C ++.


2
У мене був такий самий слід стека. Якщо відключити точку перелому "Усі винятки", це не сталося для мене.
макдад

Відповіді:


175

Додайте свою точку перерви у винятку та відредагуйте тип винятку з "Усі" на "Винятки об'єктивного С"

Деякі класи AudioToolbox містять регулярні винятки на C ++. Ви можете відфільтрувати їх таким чином.


6
Оскільки я написав розділ "РІШЕННЯ" у своєму питанні, я не вважаю це рішенням. Не AVAudioPlayerслід кидати випадкові винятки.
ThomasCle

10
"AVAudioPlayer не повинен кидати випадкові винятки" - Це не в наших руках. Ось так написано рамку, і ви повинні з цим жити. Хоча я згоден, що це не дуже гарна ідея
Mugunth

@Mugunth Чи означає це, що фреймворк відповідає і виправляє внутрішні помилки? Чи знаєте ви будь-яку іншу документацію на нього? Я не можу знайти багато в Інтернеті, що підказує мені, що це може бути до помилки програміста ...
Видалення

21

І AVAudioPlayer, і AVAudioRecorder викинуть винятки, декілька з них. Ці гравці обробляються всередині, але якщо у вас є точка перерви для "Усі точки прориву" (тобто Виняток: Усі, Перерва: На кидок), ви виберете ці винятки. Якщо ви продовжите виконання цих програм, додаток продовжуватиме працювати нормально і зовсім не працюватиме.

Єдине рішення, яке я придумав поки що, - це натиснути на панель точки перерви в Навігаторі Breakpoint, відключивши цю конкретну точку розриву та запустивши її.

Коли / якщо програма коли-небудь виходить з ладу з викинутим винятком, я cmd-6, увімкніть цю точку розриву та перезапустіть і зробіть все, що я робив, коли воно вийшло з ладу.

Редагувати: налаштування на "Об'єкти-C виключення" - це очевидно, як це зробити. Дивіться вище відповідь!


9

Ось скріншот, який показує, як я виправив цю помилку. Я не впевнений, чи йдеться так, як говориться у відповідях вище, але я припускаю, що це схоже.

  1. Перейдіть до навігатора Breakpoint у Xcode.
  2. Клацніть клавішею управління на рядку "Усі винятки".
  3. Виберіть варіант "Редагувати точку перерви ...".
  4. Змініть Exceptionз Allна на Objective-C.

введіть тут опис зображення


2

Зворотний трек дуже допоміг, дякую !. Нещодавно ми почали стикатися з тією ж проблемою. Виявляється, mp3-файли, на які він кидав, не мали дійсного тегу ID3, і запуск їх через додаток, такий як Tagr виправив їх прямо зараз!


1
Після встановлення відсутніх полів у тезі ID3 додаток більше не зупинявся при ініціалізації AVAudioPlayer, але все-таки зупинився на інструкції відтворення ...
Reinhard Männer

Які поля були обов'язкові? Усі?
регієн

@Reggian Я не пам'ятаю, це було так давно. Вибач за це! Я не пам'ятаю, щоб потрібно було додавати будь-які поля, яких не було, достатньо було просто запустити його через тег дезінфікуючий засіб, якщо я правильно пам’ятаю!
yo.ian.g

2

У Xcode 9.2 ви можете вимкнути конкретні винятки після їх перегляду. Відкрийте меню перерв і натисніть для відключення (згасла стрілка)

введіть тут опис зображення


-4

Спробуйте встановити AVAudioPlayer як змінну класу!


1
У моєму випадку я вже налаштував AVAudioPlayer як змінну класу, і вона все ще не працює. Схоже, ви насправді не знали рішення
Алекс Ціо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.