我在外部类中使用此方法,只要我的游戏中的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];
}
答案 0 :(得分:1)
我认为,以下声明是内存泄漏的来源,
player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err];
以下是讨论同一问题的SO帖子。
AVAudioPlayer Memory Leak - Media Player Framework
这是博客文章
根据博客教程,您的代码必须如下所示。
-(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什么都不做