Как отлаживать NSZombies и утечки памяти?

Я работаю над базовой игрой, которая подключается к серверу и получает данные 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];

    });

Может ли кто-нибудь сказать мне, как спасти эту ситуацию, или что я делаю неправильно.


person user2068588    schedule 01.05.2014    source источник
comment
Вы установили NSZombieEnabled на true? Если это так, как сказал @gnasher729, ни один объект на самом деле не освобождается (все они остаются в памяти), поэтому очень скоро вы будете использовать много памяти. Вы должны разрешить зомби отслеживать только один конкретный сбой, а затем снова отключить их.   -  person Nicolas Miari    schedule 01.05.2014


Ответы (2)


Такова природа объектов-зомби. Включение объектов-зомби для отладки использования объектов после их освобождения, очевидно, превратит любой такой объект в утечку. Вы не можете отлаживать с помощью зомби и одновременно искать утечки памяти.

person gnasher729    schedule 01.05.2014

Я предполагаю, что утечка памяти произойдет из-за того, что NSData объект находится в памяти.

Вы пытались сохранить папку NSData в документы в виде файла вместо объекта NSData?

Пример

[data writeToFile:filePath atomically:YES];
person Natarajan    schedule 01.05.2014
comment
Нет, я не сохраняю NSData. Я отключил NSZombies и запустил распределение в инструментах, утечки резко сократились. Однако некоторые методы интеграции с Facebook просачивались: например, когда я публиковал рекорды: вызывая методы HTTP GET на FBGraphPath, он показывал утечку, когда я читал объект результата. Также мои выделения показали мне, что VM: ImageIO_PNG_Data составляет 185 МБ. Это нормально? Спасибо! - person user2068588; 01.05.2014
comment
Да, это обычная проблема. Если вы используете [UIImage imageNamed:@image.png], это займет немного памяти. Вместо этого вы должны использовать NSCache. - person Natarajan; 01.05.2014