2011-04-14 137 views
2
- (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?

回答

0

您可以尝试

AVPlayer *shotSound = [AVPlayer playerWithURL:filePath];

注:这将返回一个新的播放器来播放由给定的URL引用一个单一的视听资源。

+0

这样有什么缺点吗? – Michael 2011-04-14 08:16:30

+0

如果你只想播放一个文件,我认为这就足够了。当你这样做时,当AutoReleasePool排空时,玩家获得释放 – visakh7 2011-04-14 09:31:21

2

如您在按下按钮等等,而不是initiliazing它在按钮每次应在类级别声明它,要么你可以在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

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

+0

让我知道是谁给了我低调,为什么? – Jhaliya 2011-04-14 08:13:57

+0

这是正确的答案。 'shotSound'应该被分配一次,然后在'dealloc'和'viewDidUnload'中释放。我添加了'viewDidUnload',因为当视图不存在时没有理由保持分配。 @ Ravin的代码将在需要时重新初始化它。 – XJones 2011-04-14 08:19:07

+0

谢谢。你的意思是shotSound应该是伊娃吗? – Michael 2011-04-14 08:30:14

相关问题