Освобождение объекта в viewDidUnload? - PullRequest
0 голосов
/ 16 сентября 2011

В моем приложении я звоню presentModelViewController, чтобы представить новый контроллер. Каждый раз, когда это действие срабатывает, выделяется память. Но почему-то он не выпускается должным образом, потому что в какой-то момент мое приложение использует слишком много памяти, и оно ломается.

Возможно, это из-за того, что я не освобождаю объекты свойств не правильно (или не совсем). Правильно ли указано ниже? Дело в том, вероятно, но как насчет viewDidUnload?

- (void)viewDidUnload {
    [_sushiTypes release];
    _sushiTypes = nil;
}

- (void)dealloc {
    [_sushiTypes release];
    _sushiTypes = nil;
    [super dealloc];
}

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Не забывайте вызов super в viewDidUnload. Вы также должны получить доступ к вашей переменной экземпляра через ее установщик, чтобы установить ее равной nil в viewDidUnload. В dealloc просто освободите переменную экземпляра напрямую.

- (void)viewDidUnload {
[super viewDidUnload];
NSLog(@"viewDidUnload being called");
self.sushiTypes = nil;
}

- (void)dealloc {
[_sushiTypes release];
NSLog(@"dealloc being called");
[super dealloc];
}

Я не думаю, что это является причиной ваших проблем с памятью. Есть ли в вашем контроллере модального представления какие-либо другие переменные экземпляра или IBOutlets?

Чтобы помочь в дальнейшей отладке, попробуйте использовать инструменты. Из Xcode, перейдите Product> Profile, затем выберите шаблон Allocations, когда откроются инструменты. Затем откройте и закройте ваш модальный контроллер несколько раз, и проверьте ваши утечки и распределения. Если распределение увеличивается каждый раз, когда вы представляете / отклоняете, попробуйте нажать кнопку «Отметить кучу» до и после каждого представления / отклонения. Затем вы можете проверить объекты, которые выделяются и не освобождаются в каждом цикле.

1 голос
/ 16 сентября 2011

Я думаю, что нашел проблему.Вы никогда не должны присваивать значение nil в функции dealloc.Обычная практика при освобождении состоит в том, чтобы viewDidUnload назначать значение nil с помощью установщика, а затем правильно освобождать свойство в методе dealloc.Вот так:

- (void)viewDidUnload {
    self._sushiTypes = nil;
    [super viewDidUnload];
}

- (void)dealloc {
    [_sushiTypes release];
    [super dealloc];
}

Не забудьте вызвать super в viewDidUnload, как сказал Мэтти.Вы можете обратиться к этому вопросу SO для получения дополнительной информации об этом процессе. Сначала установите ноль, а затем отпустите.

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