我在 iOS 5.0 下开发了一个 iPhone 应用程序,它运行良好。但是当涉及到 iOS 4.3(Base SDK = 最新的 iOS 5.0,编译器 = Apple LLVM 3.0,部署目标 = 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 下崩溃并出现奇怪的错误。谢谢!

最佳答案

在运行时,许多方法被调用,它们不在您的代码中,而是作为您进行的 API 调用的结果在幕后调用。

我不会关注被调用的方法,而是关注为什么它被发送到的对象无法响应选择器。该对象可能被强制转换为错误的类型,因此没有继承正确的方法。 (在您显示的代码片段中,您没有显式地强制转换 AVAudioSession *audio_session 。)另一个方向是检查您没有使用其他一些仅适用于 iOS 5 的 API 调用,它在后台调用此方法并因此生成错误。

最后,如果您最近才将构建目标更改为包含 iOS 4.3,您可能只需要执行干净构建(产品 > 清洁),以便编译与 iOS 4.3 兼容的代码。

关于iphone - 此应用程序在 ios 5.0 下开发并运行良好,但在 ios 4.3 下崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8397223/

10-11 19:34
查看更多