4

当我使用 AudioToolBox 播放音乐时,内存泄漏严重。

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

我使用此代码播放音乐。在 iOS5 和 iOS4 中,它可以正常工作。但是在iOS6中,如果数据大小为5M,则5M全部泄露。而且我在 Instruments 中看不到泄漏信息。

有没有人有同样的问题?任何建议将不胜感激。

我所有的音频代码都在这里(使用 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
4

2 回答 2

5

我正在使用 播放文件中的音频AVAudioPlayer,发现 iOS 模拟器一直在泄漏内存,但设备没有。这已使用 Instruments 进行了验证。这是 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;
    }
}

在模拟器中,两者都AudioSessionDevice泄漏UISoundNewDevice内存。然而,最大的泄密者实际上是NSURL. 这些泄漏都不会在设备上发生。这种行为在 iOS 6 中没有改变,但我确实将我的项目部署设置为 5.0,如果这有什么不同的话。

另请参阅https://stackoverflow.com/questions/3433487/avaudioplayer-leak-in-simulatorAudioToolbox 库 AVAudioPlayer 中的内存泄漏

于 2012-09-24T05:39:24.530 回答
1

也许你做得比我好,而我前面没有 XCode,但是:

创建对象,创建引用:

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

这是分配而不是分配,没有保留:

_musicPlayer = newMusicPlayer;

out of functionplayMusicWithMusicData它会释放.newMusicPlayer当我使用_musicPlayer. 分析器工具非常烦人,因为我做了一个保留,也许也是一个发布。

如果您使用的是 ios4,则不是 ARC 这个项目。

在 if 分支中:

    [_musicPlayer stop];
    _musicPlayer = nil;

我会检查_musicPlayer不为零,但这不会解决您的问题。

不知道它可能在哪里,如果不在 ios 中,可能会在那里:

如果您更改委托而不是自我,则解决了。

 _musicPlayer.delegate = self;

到任何其他班级?

于 2012-09-23T15:54:33.877 回答