我在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下崩溃并出现奇怪的错误。谢谢!
答案 0 :(得分:5)
在运行时,调用了许多不在代码中的方法,但是由于您进行了API调用而在后台调用这些方法。
我不会关注被调用的方法,而是关注它被发送到的对象无法响应选择器的原因。该对象可能被转换为错误类型,因此不会继承正确的方法。 (在您显示的代码段中,您没有显式转换AVAudioSession *audio_session
。)另一个方向是检查您是否仅使用iOS 5中的其他API调用,后者在后台调用此方法,从而产生错误。
最后,如果您最近才更改构建目标以包含iOS 4.3,则可能只需要进行干净构建(Product> Clean),以便编译与iOS 4.3兼容的代码。
答案 1 :(得分: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
。
答案 2 :(得分:1)
AVAudioSession
方法
- (BOOL)setMode:(NSString *)theMode error:(NSError **)outError
在文档中标记为仅适用于iOS 5及更高版本。事实上,鉴于recent addition of modes to the documentation,看起来在iOS 5之前根本无法使用音频会话模式。