首页 > 解决方案 > 来自某些用户的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS

问题描述

虽然,我无法在我的测试设备/模拟器上复制这个问题,但我收到了一些用户的崩溃报告,但不是全部。EXC_BAD_ACCESS KERN_INVALID_ADDRESS 在这一行。为什么会这样,我可以采取哪些步骤来解决?崩溃报告来自 iOS 14.4.0 和 14.3.0 用户以及各种设备(iPhone 6s plus、iPhone 8 Plus、iPhone SE(第 2 代)、iPhone XS、iPhone 7、iPhone 7s、iPhone 11、iPhone 12、iPhone X)

在 PageViewController.m

// Voice Recording - Needed as workaround as there is a bug in AudioKit
NSArray *pathComponents = [NSArray arrayWithObjects:
                           [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],
                           defaultVoiceRecording,
                           nil];
NSURL *outputFileURL = [NSURL fileURLWithPathComponents:pathComponents];

// Setup audio session to play through loud speakers
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
if(error){
    NSLog(@"AVAudioSession Sing the Note error tuner:%@",error);
}

// Setup audio session to play through loud speakers
if (![MenuViewController areHeadphonesPluggedIn]){ // EXC_BAD_ACCESS KERN_INVALID_ADDRESS here
    
    [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
    if(error)
    {
        NSLog(@"Error: AudioSession cannot use speakers");
    }
}

在 MenuViewController.h

+(BOOL)areHeadphonesPluggedIn;

在 MenuViewController.m

+(BOOL)areHeadphonesPluggedIn {
    @try{
        NSArray *availableOutputs = [[AVAudioSession sharedInstance] currentRoute].outputs;
        for (AVAudioSessionPortDescription *portDescription in availableOutputs) {
            if ([portDescription.portType isEqualToString:AVAudioSessionPortHeadphones]) {
                return YES;
            }
        }
        return NO;
    }
    @catch(id Exception){
        return NO;
    }
}

标签: iosobjective-c

解决方案


+(BOOL)areHeadphonesPluggedIn {
    @try{
        NSArray *availableOutputs = [[AVAudioSession sharedInstance] currentRoute].outputs;
        for (AVAudioSessionPortDescription *portDescription in availableOutputs) {
            if ([portDescription.portType isEqualToString:AVAudioSessionPortHeadphones]) {
                return YES;
            }
        }
        return NO;
    }
    @catch(id Exception){
        return NO;  // Not sure it will work as you exect
    }
   return NO;  // move return here!
}

推荐阅读