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

时间:2011-12-06 08:45:46

标签: iphone ios crash avaudiosession

我在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下崩溃并出现奇怪的错误。谢谢!

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之前根本无法使用音频会话模式。