это приложение было разработано и отлично работает под ios 5.0, но сбой в ios 4.3

Я разработал приложение для iPhone под iOS 5.0, и он отлично работает. Но когда дело доходит до iOS 4.3 (базовый SDK = последний iOS 5.0, компилятор = Apple LLVM 3.0, Deployment Target = iOS 4.3), он вылетает после запуска.

Вывод вокруг точки сбоя выглядит так:

2011-12-06 16:25:08.177 FMWei[466:c203] -[AVAudioSession setMode:error:]: unrecognized selector sent to instance 0x706a7f0 2011-12-06 16:25:08.181 FMWei[466:c203] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AVAudioSession setMode:error:]: unrecognized selector sent to instance 0x706a7f0' 

Похоже, что у AVAudioSession нет функции-члена setMode:error: while я ее вызывал. Но странно, что я не вызывал функцию с именем setMode:error: Код об обработке звука:

 audio_session = [[AVAudioSession sharedInstance] retain]; audio_session_err = nil; [audio_session setCategory: AVAudioSessionCategoryPlayAndRecord error:&audio_session_err]; NSLog(@"!"); UInt32 audioRouteOverride = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,sizeof (audioRouteOverride),&audioRouteOverride); UInt32 allowMixing = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); if (audio_session_err) { NSLog(@"audioSession: %@ %d %@", [audio_session_err domain], [audio_session_err code], [audio_session_err description]); } else { audio_session_err = nil; [audio_session setActive:YES error:&audio_session_err]; if (!audio_session_err) NSLog(@"audio session is activated successfully"); } 

Пожалуйста, помогите мне выяснить, почему он падает под iOS 4.3 со странной ошибкой. Спасибо!

3 Solutions collect form web for “это приложение было разработано и отлично работает под ios 5.0, но сбой в ios 4.3”

Во время выполнения вызывается множество методов, которые не входят в ваш код, но которые вызываются за кулисами в результате вызовов API, которые вы сделали.

Я бы сосредоточился не на вызываемом методе, а на том, почему отправленный объект не может ответить на селектор. Объект мог быть отличен как неправильный тип и поэтому не наследует правильные методы. (В фрагменте кода, который вы показываете, вы явно не используете AVAudioSession *audio_session .) Другое направление – проверить, что вы не используете какой-либо другой вызов API, который является только iOS 5, который в фоновом режиме вызывает этот метод и таким образом генерируя ошибку.

Наконец, если вы недавно изменили цель сборки, включив iOS 4.3, вам просто нужно сделать чистую сборку (Product> Clean), чтобы она компилировала iOS 4.3-совместимый код.

Возможно, вы можете попробовать фрагмент кода ниже

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&sessionError]; NSError * audio_session_err = nil; [audio_session setCategory: AVAudioSessionCategoryPlayAndRecord error:&audio_session_err]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&audio_session_err]; [[AVAudioSession sharedInstance] setDelegate:self]; NSLog(@"!"); UInt32 audioRouteOverride = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,sizeof (audioRouteOverride),&audioRouteOverride); UInt32 allowMixing = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); if (audio_session_err) { NSLog(@"audioSession: %@ %d %@", [audio_session_err domain], [audio_session_err code], [audio_session_err description]); } else { audio_session_err = nil; [[AVAudioSession sharedInstance] setActive:YES error:&audio_session_err]; if (!audio_session_err) NSLog(@"audio session is activated successfully"); } 

Я думаю, audio_session = [[AVAudioSession sharedInstance] retain]; отправляет метод setMode: по умолчанию. И setMode: доступен только в iOS 5.0 и более поздних версиях (см. Doc ).

Или вы можете попытаться прокомментировать код:

 UInt32 audioRouteOverride = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,sizeof (audioRouteOverride),&audioRouteOverride); UInt32 allowMixing = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); 

Должен быть метод, который отправляет setMode: по умолчанию. Попробуйте сами. :п


Попробуйте info malloc 0x706a7f0 в свой gdb, чтобы получить объект, на который был отправлен селектор. Обратите внимание: 0x706a7f0 – это адрес, указанный в вашем выводе сбоя, как один в вашем первом фрагменте кода.

И еще один совет: вы можете make clean (Poduct-> Clean) и rebuild его.

Метод AVAudioSession

 - (BOOL)setMode:(NSString *)theMode error:(NSError **)outError 

Помечается в документации как доступная только для iOS 5 и более поздних версий. Фактически, учитывая недавнее добавление режимов в документацию , похоже, что режимы аудиосессии недоступны до iOS 5.

  • В webViewDidFinishLoad я получаю дополнительную высоту контента в swift3
  • Интерфейс Builder не разрешает подключения к пользовательскому классу UIView?
  • Двоичная зачистка в двух словах
  • Существующие рамки формы iOS
  • Как я могу получить обратный вызов после вызова телефонного номера из приложения IOS?
  • Синхронизация доступа для чтения / записи к переменной экземпляра для высокой производительности в iOS?
  • При установке doRelativeDateFormatting = YES, stringFromDate возвращает nil
  • Использование программы для разработчиков iOS для бета-тестирования?
  • ViewDidAppear не вызывается при открытии приложения из фона
  • сохранить файл pdf в устройстве
  • Как отправить аудиопоток с помощью UDP-сокета в ios sdk
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.