Я работаю над базовой игрой, которая подключается к серверу и получает данные JSON. Он отлично работает в нескольких играх, но вскоре после этого вылетает из-за нехватки памяти. Я пробежался по инструментам и наткнулся на нечто довольно тревожное. Почти каждая переменная экземпляра, созданная с помощью [[Class alloc]init], просачивалась как объект NSZombie.
Как вы можете видеть на изображении, за 5 секунд я сгенерировал 9000 утечек.
Я использую АРК.
Дальнейший анализ показал, что у меня были утечки при использовании определенных методов:
-(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];
});
Может ли кто-нибудь сказать мне, как спасти эту ситуацию, или что я делаю неправильно.
NSZombieEnabled
наtrue
? Если это так, как сказал @gnasher729, ни один объект на самом деле не освобождается (все они остаются в памяти), поэтому очень скоро вы будете использовать много памяти. Вы должны разрешить зомби отслеживать только один конкретный сбой, а затем снова отключить их. - person Nicolas Miari   schedule 01.05.2014