2011-04-29 154 views
1

我得到了内存泄漏当我点击播放按钮问题....MemoryLeak在下列情况下

我与“运行和性能工具”下的是“泄漏”工具测试....模拟器上

我越来越把漏当我点击播放按钮第一次.....

这里是我的代码....

-(IBAction)play 
{ 


    [self setPlayer]; 
    [self playme]; 
} 



-(IBAction)stop 
{ 
    [self stopme]; 
    [self releasePlayer]; 

} 


-(void)setPlayer 
{ 

    NSURL *file = [[NSURL alloc] initFileURLWithPath: 
        [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"shut up.mp3"]]; 
    NSError *err = nil; 
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err]; 

    [file release]; 
    player.numberOfLoops = -1; 
    [player prepareToPlay]; 
    player.volume=1.0; 


} 


-(void)playme 
{ 
    if (!isPlaying) 
    { 
     [player play]; 
     isPlaying=YES; 
    } 
} 


-(void)stopme 
{ 
    if (isPlaying) 
    { 
     [player stop]; 
     isPlaying=NO; 
    } 
} 

-(void)releasePlayer 
{ 
    if(!isPlaying) 
    { 
     [player release]; 
     player=nil; 
    } 
    isPlaying=NO; 
} 
+0

难道你只是问同样的问题? – 2011-04-29 05:36:38

回答

2

我想,下面的语句是源的内存泄漏,

player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err]; 

这是讨论同样问题的SO帖子。

AVAudioPlayer memory leak

AVAudioPlayer memory leak

AVAudioPlayer Memory Leak - Media Player Framework

这里是博客文章

AVAudioPlayer Memory Leak

编辑:

根据博客教程,您的代码必须如下所示。

-(void)setPlayer 
{ 

    NSURL *file = [[NSURL alloc] initFileURLWithPath: 
        [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"shut up.mp3"]]; 
    NSError *err = nil; 

    NSData *data = [NSData dataWithContentsOfFile:file]; 
    AVAudioPlayer *player = [AVAudioPlayer alloc];  
    if([player initWithData:audioData error:NULL]) 
    { 

     player.numberOfLoops = -1; 
     [player prepareToPlay]; 
     player.volume=1.0; 
     [player autorelease]; 
    } 
    else 
    { 
     [player release]; 
     player = nil; 
    } 
    [file release]; 
} 

无泄漏版本存储由alloc返回的指针,而不是由initWithData返回的指针:error :.这样,无论发生什么,玩家仍可以获得释放。

+0

我已经阅读了那篇博客文章,但这并没有帮助我...... – sajwan 2011-04-29 05:42:15

+0

@RSS:尝试编辑代码并让我知道你是否还有内存泄漏。 – Jhaliya 2011-04-29 05:51:15

+0

请检查你写的代码....它有太多的错误.....仍然没有帮助我 – sajwan 2011-04-29 06:11:32

1

Jhaliya的回答中的博客文章描述了一种特定于当播放器无法启动音频的情况下发生的泄漏,例如无法找到文件时。

与您的代码真正的问题是,如果用户明确停止音频,你只释放播放器。如果音频播放到最后,则您有一个播放器实例,其retainCount为1.然后,如果用户再次播放播放,则您创建一个新播放器并将其分配给player变量,从而泄漏旧播放器。

以最简单的解决方案是让player一个保留的财产:

@property(nonatomic,retain)AVAudioPlayer *player; 

然后,而不是分配给伊娃直接,使用突变来设置播放器,将隐式释放先前设定的实例如果有一个:

[self setPlayer:[[[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err] autorelease]; 

而且不要忘记释放它在你的dealloc:

-(void)dealloc { 
    [player release]; 
    [super dealloc]; 
}