Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 音频完成后,访问navigationController会产生EXC_BAD_访问_Objective C_Ios_Ios4_Ios5 - Fatal编程技术网

Objective c 音频完成后,访问navigationController会产生EXC_BAD_访问

Objective c 音频完成后,访问navigationController会产生EXC_BAD_访问,objective-c,ios,ios4,ios5,Objective C,Ios,Ios4,Ios5,这个问题的起源来自于对这个问题的回答 我有一系列由自己的ViewController管理的谜题。工作流如下所示: UINavigationViewController-->菜单视图控制器-->路由视图控制器-->随机选择的拼图视图控制器 “路由视图控制器”随机选择一个拼图视图控制器以推送到堆栈上。一旦有人解决了这个难题,我就播放一个“YouWin”音频样本,然后从堆栈中弹出视图控制器。在这一点上,路由视图控制器随机选择下一个谜题。下面是我播放声音和从堆栈中弹出拼图视图控制器的代码: -(void

这个问题的起源来自于对这个问题的回答

我有一系列由自己的ViewController管理的谜题。工作流如下所示:

UINavigationViewController-->菜单视图控制器-->路由视图控制器-->随机选择的拼图视图控制器

“路由视图控制器”随机选择一个拼图视图控制器以推送到堆栈上。一旦有人解决了这个难题,我就播放一个“YouWin”音频样本,然后从堆栈中弹出视图控制器。在这一点上,路由视图控制器随机选择下一个谜题。下面是我播放声音和从堆栈中弹出拼图视图控制器的代码:

-(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代码分析工具,以确认没有其他内存泄漏,因此如果我遗漏了任何细节,请随时填写

仅供参考…谢谢你为我指明了正确的方向