3

iOS 5.0 で iPhone アプリを開発しましたが、問題なく動作します。しかし、iOS 4.3(Base 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:しかし、奇妙なのは、名前が である関数を呼び出さなかったことです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 で奇妙なエラーが発生してクラッシュする理由を教えてください。ありがとうございました!

4

3 に答える 3

5

実行時には、コード内にはなく、API 呼び出しの結果としてバックグラウンドで呼び出される多くのメソッドが呼び出されます。

呼び出されているメソッドではなく、送信先のオブジェクトがセレクターに応答できない理由に注目します。オブジェクトが間違った型としてキャストされた可能性があるため、正しいメソッドを継承していません。(表示するコード スニペットでは、明示的にキャストしませんAVAudioSession *audio_session。)もう 1 つの方向は、iOS 5 のみである他の A​​PI 呼び出しを使用していないことを確認することです。これは、バックグラウンドでこのメソッドを呼び出し、したがって、エラー。

最後に、iOS 4.3 を含めるようにビルド ターゲットを最近変更したばかりの場合は、iOS 4.3 互換コードをコンパイルするためにクリーン ビルド ([製品] > [クリーン]) を実行するだけでよい場合があります。

于 2011-12-06T09:18:02.727 に答える
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:デフォルトでディスパッチするメソッドが必要です。自分で試してみてください。:p


gdbを試しinfo malloc 0x706a7f0て、セレクターが送信されたオブジェクトを取得してください。0x706a7f0は、クラッシュ出力に最初のコードスニペットのアドレスとして表示されるアドレスであることに注意してください。

そして別のヒント、あなたはmake clean(Poduct-> Clean)そしてrebuildそれをするかもしれません。

于 2011-12-06T09:18:47.310 に答える
1

AVAudioSession方法_

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

ドキュメントでは、iOS 5 以降でのみ使用できるとマークされています。実際、最近ドキュメントにモードが追加されたことを考えると、 iOS 5 より前のオーディオ セッション モードはまったく利用できないようです。

于 2011-12-06T09:13:18.813 に答える