简单的例子,但我不明白为什么没有泄漏

时间:2011-04-14 07:53:53

标签: iphone xcode memory-management

- (IBAction) btnFire:(id)sender {

    NSString *path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath],   @"/gunShot.wav"];

    NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

    AVPlayer *shotSound = [[AVPlayer alloc] initWithURL:filePath];

    [shotSound play];
}

如果我在这里发布shotSound,它将无法播放。同时没有泄漏。

为什么仪器没有泄漏?如何发布shotSound?

2 个答案:

答案 0 :(得分:2)

因为当按下按钮时你会一次又一次地需要声音,而不是每次在类级别声明它而不是在按钮中初始化它,你可以在viewDidLoad方法中初始化它,或者你也可以这样做

- (IBAction) btnFire:(id)sender {

 if(shotSound==nil)
{
        NSString *path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath],   @"/gunShot.wav"];

        NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

       shotSound = [[AVPlayer alloc] initWithURL:filePath];
}

        [shotSound play];

}

dealloc中发布。如果您希望在此操作上发出声音,则可以使用AVAudioPlayer

有时仪器的泄漏无法检测到,在这种情况下,您可以使用构建和分析工具。另外,正如你所说,如果你发布了玩家对象,那么应用程序崩溃可能会导致音频仍在播放并且你释放播放器(不确定)。

答案 1 :(得分:0)

你可以尝试

AVPlayer *shotSound = [AVPlayer playerWithURL:filePath];

注意:这将返回一个新播放器,以播放由给定网址引用的单个视听资源。