我正在开发一款基本游戏,它连接到服务器并获取JSON数据。它可以在几场比赛中运行良好,但由于内存压力很快就会崩溃。我跑过乐器,遇到了令人不安的事情。几乎所有由[[Class alloc] init]实例化的实例变量都被泄露为NSZombie对象。
正如您在图像中看到的那样,在5秒钟内,我似乎已经产生了9000次泄漏。
我正在使用ARC。
进一步的分析显示,当使用某些方法时,我正在泄漏:
-(void) playTimeUp
{
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"Gameover"
ofType:@"wav"]];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
if (audioPlayer && soundShouldPlay){
[audioPlayer setDelegate:self];
[audioPlayer prepareToPlay];
[audioPlayer setVolume:.20];
[audioPlayer play];
[self.audioPlayers addObject:audioPlayer];
}
}
我也经常使用dataWithContentsOfUrl方法。
dispatch_async(kBackgroundQueue, ^{
NSData* data = [NSData dataWithContentsOfURL:completeUrl];
[self performSelectorOnMainThread:@selector(startMethod:) withObject:data waitUntilDone:YES];
});
有人能告诉我如何挽救这种情况,或者我做错了什么。
答案 0 :(得分:2)
这是僵尸物体的本质。打开僵尸对象以在解除分配后调试对象的使用显然会将任何此类对象变为泄漏。您无法使用僵尸进行调试并同时搜索内存泄漏。
答案 1 :(得分:0)
我假设由于NSData
对象在内存中存在而导致内存泄漏。
您是否尝试将NSData
文件夹保存为文件而不是NSData对象?
实施例
[data writeToFile:filePath atomically:YES];