2012-09-23 55 views
4

當我使用AudioToolBox播放音樂時,內存嚴重泄漏。iOS6中的AudioToolBox泄漏?

AVAudioPlayer *newMusicPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error]; 

我使用此代碼播放音樂。在iOS5和iOS4中,它可以正常工作。但在iOS6中,如果數據大小爲5M,則所有5M都會泄露。在樂器中我看不到泄漏信息。

有沒有人有同樣的問題?任何建議將不勝感激。

我所有的音頻代碼在這裏(使用ARC):

@implementation ViewController 
{ 
    AVAudioPlayer *_player; 
} 

- (void)play 
{ 
    if (_player) 
    { 
     [_player stop]; 
     _player = nil; 
    } 

    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"test.app/1.mp3"]; 
    NSData *musicData = [[NSData alloc] initWithContentsOfFile:path]; 
    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:musicData error:nil]; 
    player.volume = 1; 
    if (player) 
    { 
     _player = player; 
    } 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    button.frame = CGRectMake(100, 100, 100, 100); 
    [button setTitle:@"play" forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(play) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:button]; 
} 

@end 
+0

檢查發佈說明確切地做了一些改變!在ios6 – 2012-09-23 14:28:52

+0

你是否觀察到iOS模擬器或設備中的內存泄漏?或兩者? –

+0

在模擬器中。事實上,我無法在4.5的樂器上獲得設備上的objc符號,只有c符號顯示 – OpenThread

回答

4

我正在使用AVAudioPlayer從文件播放音頻,並發現iOS模擬器始終會泄漏內存,但設備不會。這是使用儀器驗證的。這是ARC代碼。

我的球員聲明如下:

@property (nonatomic, retain) AVAudioPlayer *numberPlayer; 

像這樣合成:

@synthesize numberPlayer = _numberPlayer; 

因爲我需要打一些不同的聲音,並AVAudioPlayer不能復位,以發揮不同的音頻文件在創建之後,我每次都會創建一個新玩家,像這樣:

NSString *audioFilePathName = [NSString stringWithFormat:@"Voices/%@/%03i.m4a", self.voiceName, self.theNumber]; 
NSURL *url = [NSURL fileURLWithPath:BUNDLE_FULL_PATH(audioFilePathName)]; 
self.numberPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; 
self.numberPlayer.numberOfLoops = 0; 
[self.numberPlayer setCurrentTime:0.0]; 
[self.numberPlayer setDelegate:self]; 
[self.numberPlayer prepareToPlay]; 
[self.numberPlayer play]; 

在我委託我的播放器設置爲nil時,它已經完成播放:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
    if (player == self.numberPlayer) { 
     _numberPlayer = nil; 
    } 
} 

在模擬器,既AudioSessionDeviceUISoundNewDevice泄漏內存。但是,最大的泄露點實際上是NSURL。設備上沒有發生這些泄漏。這種行爲在iOS 6中沒有改變,但是我確實將我的項目部署設置爲5.0,如果這有所作爲。

另請參閱https://stackoverflow.com/questions/3433487/avaudioplayer-leak-in-simulatormemory leak in AudioToolbox library AVAudioPlayer

+3

initWithContentsOfURL:保存兆字節的內存,並且只有initWithData:泄漏兆字節。我將在我的項目中用initWithContentOfURL替換initWithData。謝謝 :) – OpenThread

1

也許你確實比我好,我沒有在我面前的XCode,但:

對象創建的,創建參考:

AVAudioPlayer *newMusicPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error]; 

它是分配和不分配,不保留:

_musicPlayer = newMusicPlayer; 

功能異常playMusicWithMusicData它會釋放newMusicPlayer,當我使用_musicPlayer時,它會使我的代碼在其他函數中崩潰。分析器工具嘮叨得很多,我做了一個保留,也許是一個發佈。

如果您使用的是ios4,那麼不是ARC這個項目。

中,如果分支

[_musicPlayer stop]; 
    _musicPlayer = nil; 

我會檢查_musicPlayer不是零,但不會解決你的問題。

不知道在那裏它可能是,如果不是在iOS和可能有這將是:

難道如果你改變了委託,而不是自我解決。

_musicPlayer.delegate = self; 

to any other class?

+0

我創建了一個測試項目並粘貼了其代碼,它與我的音樂項目有相同的問題,在iOS6中泄漏,在iOS4/5中泄漏。我甚至沒有將任何代理設置爲AVAudioPlayer,它沒有區別T___T – OpenThread