3

我在 iOS 5.0 下开发了一个 iPhone 应用程序,它运行良好。但是对于 iOS 4.3(Base SDK = latest iOS 5.0,compiler = 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转换 。)另一个方向是检查您是否没有使用其他仅 iOS 5 的 API 调用,它在后台调用此方法并因此生成错误。

最后,如果您最近才将构建目标更改为包含 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


尝试info malloc 0x706a7f0在您的 gdb 中获取选择器发送到的对象。请注意,这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 回答