2011-04-24 39 views
0

我必須在iphone卡遊戲循環中播放一個whoosh聲音,並且使用下面仍然存在內存泄漏的聲音。 還有什麼可以做,以避免泄漏?AVAudioPlayer內存泄漏

// AVAudioPlayer ------------------------------------------- --------------------------------------

NSAutoreleasePool *audioDataspool = [[NSAutoreleasePool alloc] init]; // pool is created 
{ 
    NSString *soundpath = [[NSBundle mainBundle] pathForResource:@"cardwhoosh" ofType:@"mp3"]; 

    NSData *audioData = [[NSData dataWithContentsOfFile:soundpath]autorelease]; 

    AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithData:audioData error:NULL]; 

    soundpath = nil; 
    [soundpath release]; 

    [player play];//play sound 

    player = nil; 
    [player release]; 
    [player autorelease]; 
    audioData = nil; 
    [audioData release]; 
} 
    [audioDataspool release]; // all your autoreleased objects are released 

回答

4

我不認爲你完全理解內存管理。請閱讀Apple的文檔或其他教程以獲得進一步的幫助。

下面的源代碼將工作,沒有泄漏:

NSString *soundpath = [[NSBundle mainBundle] pathForResource:@"cardwhoosh" ofType:@"mp3"]; /* autoreleased object */ 
NSData *audioData = [NSData dataWithContentsOfFile:soundpath]; /* autoreleased object */ 
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:audioData error:NULL]; /* contains init, so must be released */ 
[player play]; 
[player release], player = nil; /* Setting to nil is optional */ 

所有你在這裏是指針的變量。在Objective-C中,包含init,createcopy的所有方法都會返回不會自動發佈的對象。在你的情況下,這意味着只有player需要被釋放。這可以通過發送autorelease來完成,然後它將被拋到runloop的NSAutoreleasePool上並在runloop結束時釋放。或者你可以通過發送release立即發佈,我已經在上面完成了。

即使在調用release之前,您仍將變量設置爲nil。這意味着你然後在nil指針上調用一個方法,這將不會執行任何操作。您不再有指向該對象的指針(它剛被重寫)導致內存泄漏。

+0

感謝您的幫助。你是對的我對存儲器管理了解不多,我會讀一讀。當使用你的代碼時,它不會播放聲音,只有當我的播放器=零;首先,但是這並不能防止泄漏,正如你所提到的那樣。 – 2011-04-24 18:28:37

+0

請通過編寫適當的方法在AVAudioPlayer上包含autorelease來幫助我* player = [[AVAudioPlayer alloc] initWithData:audioData error:NULL];所以我可以嘗試NSAutorelease runloop。 – 2011-04-24 18:33:26

+0

我現在明白了'AVAudioPlayer'一旦釋放就會停止播放(這真的很正常,但我從來沒有想到過)。你可以做的最好的事情就是讓'player'成爲一個實例變量並將它釋放到'dealloc'中,這樣它就會被釋放。爲了節省一些內存,您還可以實施委託協議,以便在播放完成後釋放音頻播放器。我不會詳細討論這一點,請搜索代表團和協議。 – Joost 2011-04-24 18:55:00