2009-04-24 4 views
1

Где-то я читал, что у меня возникают проблемы с памятью, когда я отказываюсь от временного представления из-за предупреждения о низкой памяти (загружая его снова, как только пользователь хочет его увидеть), если класс theViewController не делает такие вещи на каждом выходе из этой точки зрения:Что мне нужно учитывать в многопользовательском приложении, когда речь идет о предупреждениях с низкой памятью?

-(void)dealloc { 
    [myView release], myView = nil; 
    [myLabel release], myLabel = nil; 
    [super dealloc]; 
} 

Я смущен здесь, потому что на самом деле я думал, что [MyView релиз] будет также сделать ноль-вещь, говоря, что переменная не держит объект больше. Почему дважды? Или что-то я пропустил?

ответ

5

Вызов [myView release] не изменяет значение myView, оно уменьшает сохранить кол объекта, который указывает на myView (и, когда сохранение количества объекта стремится к нулю, он сам dealloc S). После вызова [myView release], myView по-прежнему содержит адрес объекта вида, но если myView был единственным владельцем, этот объект имеет dealloc ed сам, и память больше не действительна (и теперь мой объект занят другим объектом или другими данными). Установив myView на номер nil, вы убедитесь, что вы случайно не использовали старую память, которая раньше принадлежала myView, и теперь вы можете проверить, была ли инициализирована или отброшена myView.

Обратите внимание, что вам не нужно устанавливать myView к nil в методе -dealloc, так как ваш контроллер представления уходит в этот момент так или иначе, но вы хотели бы сделать это, если вы сбрасываете ваш взгляд в ответ на низкий предупреждение о памяти. Вы также можете отказаться от всего контроллера просмотра, если его вид не отображается.

+0

спасибо. Поэтому в случае предупреждения о низкой памяти я бы написал [myView release], myView = nil; прямо внутри этого метода предупреждения о предупреждении памяти с низкой памятью? Или self.myView = nil работает одинаково? – Thanks

+0

Предполагая, что ваш @property myView определен как сохранение или копирование, в любом случае это сработает. –

0

Когда диспетчер представлений получает предупреждение о сохранении памяти, а представление вне экрана, оно может установить для свойства вида значение nil. Но это не приведет к выпуску каких-либо подзаголовков, которые вы могли бы сохранить в других свойствах. Итак, вот как вы можете это сделать:

- (void)setView:(UIView *)view 
{ 
    [super setView:view]; 
    if (view == nil) 
    { 
    // Release-and-nil any subviews that you might be retaining. 
    } 
} 
Смежные вопросы