AVAudioPlayer内存泄漏

时间:2011-05-11 05:45:24

标签: iphone objective-c cocoa-touch memory-management avaudioplayer

我在外部类中使用此方法,只要我的游戏中的charachter撞到墙壁(大约每5秒钟一次)就会调用它。我不明白。我认为我处于内存管理之上。每次调用该方法时,都会泄漏少量内存(Malloc 38或42字节)这种情况一直在发生,游戏冻结了。这是我的代码:

-(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];
}

2 个答案:

答案 0 :(得分: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:。这样,无论发生什么,玩家仍然可以被释放。

答案 1 :(得分:1)

当然,它会导致内存泄漏

首先你说,boing是nil(但是内存没有被释放,泄露),然后尝试发送消息给nil。你应该这样做:

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

在发布之前无需检查boing为nil,因为发送消息给nil什么都不做

相关问题