这个应用程序开发和工作正常在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之前根本不可用。