0

我试图弄清楚异常处理在Objective-C中是如何工作的。所以我通过执行一个不存在的选择器(boom)来强制异常。当我运行它时,应用程序崩溃了,异常没有得到正确处理。有人可以告诉我在objective-c中处理异常的正确方法吗?

@try{
       [self performSelector:@selector(boom)];
     }
     @catch (NSException *ex) {
         NSLog(@"Error");
     }

...并且有人也可以告诉我如何处理下面代码的异常。我将一个实例变量用于四种不同的音效。播放后,我将变量设置为零。出于某种原因,下面的代码有时会破坏应用程序,因此我想处理该异常。谢谢。

- (void) playSound:(NSUInteger) number withDelay:(NSTimeInterval) delay
{
    if(sound == nil)
    {
        NSURL* url;
        switch (number)
        {
            case 1: url = [[NSBundle mainBundle] URLForResource:@"Shuffle" withExtension:@"caf"]; break;
            case 3: url = [[NSBundle mainBundle] URLForResource:@"Clap" withExtension:@"caf"]; break;
            case 4: url = [[NSBundle mainBundle] URLForResource:@"Glass" withExtension:@"caf"]; break;
            case 5: url = [[NSBundle mainBundle] URLForResource:@"Knock" withExtension:@"caf"]; break;
            default: break;
        }

        if (url != nil)
        {
            sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
            [sound setCurrentTime:0];
            [sound prepareToPlay];
            [sound setVolume:1.0];
            [sound performSelector:@selector(play) withObject:nil afterDelay: delay];
        }
    }
}
4

1 回答 1

2

异常处理不会在这里解决您的问题,

如果您- (void) playSound:(NSUInteger) number withDelay:(NSTimeInterval) delay从按钮按下事件中调用。多次按下按钮会导致这种崩溃。因为您正在使用相同的 AVAudioPlayer 变量*sound并且相同的对象用于在延迟后播放声音。来自其他按钮按下的调用可能正在启动声音播放器,而另一个尝试播放声音。

如果这些是短声音片段(少于 30 秒),不使用AVAudioPlayer,您最好使用AudioServicesPlaySystemSound

您可以编写一个方法来延迟开始播放,这将让您同时播放多个声音片段而没有任何问题。

NSString *path = [[NSBundle mainBundle] pathForResource:@"Shuffle" ofType:@"caf"];
NSURL *url = [NSURL fileURLWithPath:path];
SystemSoundID  soundFileObject;
AudioServicesCreateSystemSoundID ((__bridge_retained CFURLRef) url, &soundFileObject);
AudioServicesPlaySystemSound (soundFileObject);
于 2013-05-05T05:40:01.197 回答