Objective c 音频完成后,访问navigationController会产生EXC_BAD_访问
这个问题的起源来自于对这个问题的回答 我有一系列由自己的ViewController管理的谜题。工作流如下所示: UINavigationViewController-->菜单视图控制器-->路由视图控制器-->随机选择的拼图视图控制器 “路由视图控制器”随机选择一个拼图视图控制器以推送到堆栈上。一旦有人解决了这个难题,我就播放一个“YouWin”音频样本,然后从堆栈中弹出视图控制器。在这一点上,路由视图控制器随机选择下一个谜题。下面是我播放声音和从堆栈中弹出拼图视图控制器的代码:Objective c 音频完成后,访问navigationController会产生EXC_BAD_访问,objective-c,ios,ios4,ios5,Objective C,Ios,Ios4,Ios5,这个问题的起源来自于对这个问题的回答 我有一系列由自己的ViewController管理的谜题。工作流如下所示: UINavigationViewController-->菜单视图控制器-->路由视图控制器-->随机选择的拼图视图控制器 “路由视图控制器”随机选择一个拼图视图控制器以推送到堆栈上。一旦有人解决了这个难题,我就播放一个“YouWin”音频样本,然后从堆栈中弹出视图控制器。在这一点上,路由视图控制器随机选择下一个谜题。下面是我播放声音和从堆栈中弹出拼图视图控制器的代码: -(void
-(void) playSound:(SystemSoundID)soundID withClientData:(UIViewController*)clientData {
soundIsPlaying = true;
if (clientData)
AudioServicesAddSystemSoundCompletion(soundID, nil, nil, soundFinishedPlaying, (__bridge void *)clientData);
else
AudioServicesAddSystemSoundCompletion(soundID, nil, nil, soundFinishedPlaying, nil);
AudioServicesPlaySystemSound(soundID);
}
void soundFinishedPlaying(SystemSoundID ssID, void *clientData)
{
soundIsPlaying = false;
if(clientData) {
NSLog(@"clientData not null!");
UINavigationController * navController = ((__bridge UIViewController *) clientData).navigationController;
if (navController){
NSLog(@"navController not null!");
[navController popViewControllerAnimated:false];
} else {
NSLog(@"NavController was nil!");
}
}
}
问题是在第二个谜题解决后,我在soundFinishedPlaying中的这行代码上抛出了一个EXC_BAD_访问错误:
UINavigationController * navController = ((__bridge UIViewController *) clientData).navigationController;
如果我调试这行代码,我可以看到clientData引用了一个UINavigationController,所以我有点困惑,为什么我会看到这个错误
我怀疑这可能与我需要为soundFinishedPlaying指定一个直接的C函数和/或我需要将UIViewController引用作为void*传递有关
请告诉我哪里出了问题,或者是否有更好的方法在音频剪辑播放完成后触发视图转换。提前谢谢 我知道这里发生了什么。问题在于我在这条线上的“桥梁”铸造:
AudioServicesAddSystemSoundCompletion(soundID, nil, nil, soundFinishedPlaying, (__bridge void *)clientData);
如果我将bridge模式改为uu bridge u reserved,则可以确保我的NavigationController实例在声音完成方法完成之前不会被取消引用。通过使用uuu bridge u retained,这也意味着我必须在soundFinishedPlaying中使用CFRelease(…)来明确地取消引用该点
我仍在使用Apple代码分析工具,以确认没有其他内存泄漏,因此如果我遗漏了任何细节,请随时填写
仅供参考…谢谢你为我指明了正确的方向 我知道这里发生了什么。问题在于我在这条线上的“桥梁”铸造:
AudioServicesAddSystemSoundCompletion(soundID, nil, nil, soundFinishedPlaying, (__bridge void *)clientData);
如果我将bridge模式改为uu bridge u reserved,则可以确保我的NavigationController实例在声音完成方法完成之前不会被取消引用。通过使用uuu bridge u retained,这也意味着我必须在soundFinishedPlaying中使用CFRelease(…)来明确地取消引用该点
我仍在使用Apple代码分析工具,以确认没有其他内存泄漏,因此如果我遗漏了任何细节,请随时填写
仅供参考…谢谢你为我指明了正确的方向