Как преобразовать код, чтобы правильно освободить память - PullRequest
0 голосов
/ 19 апреля 2010

Я взял кодовую базу, в которой есть тонкие недостатки - аудиоплеер отключается, неблокированные сбои, странное поведение и т.д.

Я нашел способ спровоцировать один случай проблемы и отследил его до следующего фрагмента кода:

- (void)playNextArrayObject {

NSURL *soundURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]
  pathForResource:[[soundsToPlay objectAtIndex:count] description] 
  ofType:@"mp3"]];
self.audioPlayer = nil;

self.audioPlayer = [[AVAudioPlayer alloc] 
  initWithContentsOfURL:soundURL error:nil];

self.audioPlayer.delegate = self;
AudioSessionSetActive(YES);
[audioPlayer play];
}

Когда я закомментирую 2-ю строку (ноль) и добавлю выпуск в конец, эта проблема прекращается.

[self.audioPlayer release];
  1. Куда мне идти отсюда?
  2. Nils одинаково используются во всем коде (и могут вызывать похожие проблемы) - есть ли безопасный способ их удалить?
  3. Я новичок в управлении памятью - как я могу отличить правильное использование нуля от неправильного использования нуля?

1 Ответ

1 голос
/ 19 апреля 2010

Ваше изменение верно - строка = nil является noop, и освобождение необходимо после alloc / init. Использование self.something = nil может быть хорошей практикой; он освобождает текущее значение свойства и гарантирует, что вы не сможете сделать недопустимый доступ к освобожденной памяти.

Хорошее управление памятью просто. Но вы должны прочитать Руководство по управлению памятью Какао для получения четких инструкций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...