我有一个示例应用程序,它使用AudioKit来录制音频并显示该音频数据的波形.此示例应用程序有两个viewControllers,其中根vc是一个空白页面,其中包含一个按钮,用户可以将该用户带到录音页面.
出于某种原因,仅在iPhone X(iOS 11.4.1)上,在录制音频时,如果我点击导航栏上的后退按钮(左上角),然后尝试再次录制,应用程序将崩溃.
特别是当录音机的方法appendDataFromBufferList: withBufferSize:调用时,应用程序似乎崩溃ExtAudioFileWrite(self.info->extAudioFileRef, bufferSize, bufferList).控制台中打印的错误消息是:
testAudioCrash(1312,0x16e203000)malloc:***对象0x109803a00的错误:释放对象的校验和不正确 - 对象可能在被释放后被修改. ***在malloc_error_break中设置断点以进行调试
我经历过僵尸剖析,泄漏剖析,逐步完成逻辑和堆栈,但我似乎无法弄清楚为什么会发生这种情况.
下面我提供了测试应用程序的代码以及堆栈和控制台输出的屏幕截图.任何帮助弄清楚为什么会崩溃将非常感激.不幸的是,这次崩溃也不是100%可重复的事实让我对它更加模糊.
代码注释如下:.h文件中没有自定义代码,所以我没有提供.每个视图控制器都有xib文件,其中包含UI组件.它们非常简单,所以我没有提供有关这些的信息,虽然我没有任何问题提供任何信息,任何人都要求.如果有人认为有必要,我也可以压缩项目并分享.
Repro步骤:1)启动应用2)点击录制音频按钮3)点击录制按钮4)点击导航栏上的按钮
5)重复步骤2-4直到发生崩溃
AppDelegate.m代码:
#import "AppDelegate.h"
#import "testViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
testViewController* rootVC = [[testViewController alloc] initWithNibName: @"testViewController" bundle: NSBundle.mainBundle];
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController: rootVC];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
- (void)applicationWillResignActive:(UIApplication …Run Code Online (Sandbox Code Playgroud)