AVAudioPlayer内存泄漏(AVAudioPlayer memory leak)

2019-07-04 02:24发布

我坚持就有关AVAudioPlayer一些奇怪的内存泄漏问题,我需要努力来考虑一切后的帮助。

这是问题的简短描述 - 代码之后出现。 我初始化我的球员,并开始播放音轨无限循环(和无限循环或一个时间播放未改变问题)。 音乐开始几秒钟后,我切换到另一声轨,因此我创建一个新的播放器,对其进行初始化,释放旧的(这是玩),然后设置到位的新的和播放。

在那个时间点(之后我称之为新的播放器 - [Player播放])我得到了内存泄漏(3.5KB的)。

我试过如下:

  • 停止老玩家,然后释放它 - 没有影响

  • 释放播放器播放指令之后 - 没有开始播放

  • 松开两倍老玩家 - 崩溃

  • 当我创建和播放的第一个球员内存泄漏不会发生!

此外,在参考它说,“玩”是异步,因此它很可能通过增加1引用计数,但是在这种情况下,为什么没有[播放器停止]帮助?

谢谢,

以下是关于如何使用它的代码的某些部分:

- (void) loadAndActivateAudioFunction {
NSBundle        *mainBundle = [NSBundle mainBundle];
NSError         *error;
NSURL           *audioURL = [NSURL fileURLWithPath:[mainBundle pathForResource: Name ofType: Type]];
AVAudioPlayer   *player = [(AVAudioPlayer*) [AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error];

if (!player) {
    DebugLog(@"Audio Load Error: no Player: %@", [error localizedDescription]);
    DuringAudioPrep = false;
    return;
}
[self lock];
[self setAudioPlayer: player];
[self ActivateAudioFunction];
[self unlock];

}

- (void) setAudioPlayer : (AVAudioPlayer *) player {
if (Player)
{
    if ([Player isPlaying] || Repeat)  // The indication was off???
        [Player stop];
    [Player release];
}
Player = player;

}

- (void) ActivateAudioFunction {
[Player setVolume: Volume];
[Player setNumberOfLoops: Repeat];    
[Player play];

DuringAudioPrep = false;

}

Answer 1:

下面是方法,无需导致内存泄漏创建AVAudioPlayer。 看到这个页面的交代 。

我在我的应用程序,这打消了我的AVAudioPlayer泄漏100%确定。

- (AVAudioPlayer *)audioPlayerWithContentsOfFile:(NSString *)path {
    NSData *audioData = [NSData dataWithContentsOfFile:path];
    AVAudioPlayer *player = [AVAudioPlayer alloc];
    if([player initWithData:audioData error:NULL]) {
        [player autorelease];
    } else {
        [player release];
        player = nil;
    }
    return player;
}


Answer 2:

执行协议AVAudioPlayerDelegate及其方法audioPlayerDidFinishPlaying:成功:再松开音频播放器对象

例如。

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    [player release]; // releases the player object
}


Answer 3:

你的代码看起来OK我就我所看到的,所以也许有代码的其他地方,这是造成问题。

我会说,你用一种奇怪的成语。 而不是保留在创建和释放的一套,我会做这样的事情:

    // new players will always be created autoreleased.
    AVAudioPlayer   *player = [[(AVAudioPlayer*) [AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error] autorelease];

- (void) setAudioPlayer : (AVAudioPlayer *) player 
{
  if (Player)
  {
      if ([Player isPlaying] || Repeat)  // The indication was off???
            [Player stop];
        [Player release];
  }
  Player = [player retain];
}

通过这种方式,你只保留“玩家”的对象时,他们实际上进入你的setAudioPlayer方法,它可能更容易追查。

此外,验证它实际上是被泄露的AVAudioPlayer对象。 仪器应该可以验证这一点给你。



Answer 4:

尝试添加MediaPlayer.framework到项目



文章来源: AVAudioPlayer memory leak