2011-04-29 119 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]; 
}