0

我在外部類中有這種方法,每當我的遊戲中的charachter碰到牆時(大約每5秒平均一次)就會被調用。我不明白這一點。我認爲自己處於內存管理之上。每次調用該方法時,都會泄漏少量內存(Malloc 38或42字節),這種情況會持續發生,遊戲就會凍結。這裏是我的代碼:AVAudioPlayer內存泄漏

-(void)playBoing { 
    int x = (arc4random()%3)+1; 
    NSString *path = [NSString stringWithFormat:@"/boing_0%i.aif", x]; 

    NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; 
    resourcePath = [resourcePath stringByAppendingString:path]; 

    if (boing != nil) { 
     boing = nil; 
     boing.delegate = nil; 
     [boing release]; 
    } 
    boing = [[AVAudioPlayer alloc] initWithContentsOfURL: 
      [NSURL fileURLWithPath:resourcePath] error:nil]; 

    boing.delegate = self; 
    boing.volume = 1; 
    [boing play]; 
} 

回答

1

當然,這是導致內存泄漏

首先,你說,那是博英爲零(但內存沒有釋放,泄露),然後試圖發送釋放消息到零。你應該做的是這樣的:

[boing release]; 
boing = [[AVAudioPlayer alloc] initWithContentsOfURL: 
      [NSURL fileURLWithPath:resourcePath] error:nil]; 

無需釋放前檢查嘣了零,因爲發送消息至零無能爲力

+0

哦,我明白了。謝謝你,這是一個很好的幫助 –

+0

這是一個合理的解決方案。代碼中的原始問題是在釋放它之前將boing設置爲零,因此您始終將釋放發送到nil。通常你會釋放,然後設置一個變量爲零,如果有必要。 –

1

我想,下面的語句是內存泄漏的源頭,

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

退房的SO後也可以參考評論http://stackoverflow.com/questions/5828238/memoryleak-problem-in-following-case/5828304#5828304 – Jhaliya