这个应用程序开发和工作正常在iOS 5.0下,但崩溃在iOS 4.3下

我开发了iOS 5.0下的iPhone应用程序,它工作正常。 但是当涉及到iOS 4.3(基础SDK =最新的iOS 5.0,编译器=苹果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处理的代码是:

 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调用,会在幕后调用这些方法。

我不关注被调用的方法,而是关注为什么它被发送到的对象无法响应select器。 该对象可能已被转换为错误的types,所以不能inheritance正确的方法。 (在你显示的代码片段中,你没有明确地AVAudioSession *audio_session 。)另一个方向是检查你是不是在使用其他的仅仅是iOS 5的API调用,在后台调用这个方法,从而产生错误。

最后,如果您最近才将您的构build目标更改为包含iOS 4.3,那么您可能只需执行干净的构build(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:默认情况下。 试试看吧。 :p


试试你的gdb中的info malloc 0x706a7f0来获得select器被发送到的对象。 请注意, 0x706a7f0是在您的第一个代码片段中显示在您的崩溃输出中的地址。

另一个提示,你可以做make clean (Poduct-> Clean)并rebuild它。

AVAudioSession方法

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

在文档中标记为仅适用于iOS 5及更高版本。 事实上,鉴于最近在文档中添加了模式 ,看起来audio会话模式在iOS 5之前根本不可用。