我有一个带有回调的应用程序,用于录制和播放音频。从录制回调中,我调用了一个函数来更新 GUI:
[mainViewController performSelectorOnMainThread:@selector(updateGuiAfterOnset) withObject:nil waitUntilDone:NO];
它工作正常,但是在我将应用程序发送到后台(使用设备的home
按钮)并再次打开它后,应用程序在第二次调用后updateGuiAfterOnset
崩溃,具体来说,它在调用后崩溃:
[myUIImageView setImage:myUIImage];
我在applicationWillResignActive
and中做的唯一事情applicationDidBecomeActive
是停止和启动 audioUnit:
AudioOutputUnitStop(audioUnit);
和
AudioOutputUnitStart(audioUnit);
我的直觉是在进入后台/前台过程中某些变量被搞砸了,但这只是一个猜测。
有任何想法吗?在多线程应用程序中进入后台时,我需要做任何推荐的事情吗?
编辑如果从主线程调用 gui-updating-method(通过点击按钮),该应用程序也会崩溃。
崩溃报告中的相关部分:
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008
Crashed Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x000027d8 objc_msgSend + 16
1 UIKit 0x00009738 -[UIImageView setImage:] + 140
2 TimeKeeper 0x00002b7a -[MainViewController updateGuiAfterOnset] (MainViewController.m:89)
3 CoreFoundation 0x0003e2e4 -[NSObject(NSObject) performSelector:withObject:] + 16