Что я должен учитывать в multiview-приложении, когда дело доходит до предупреждений о нехватке памяти? - PullRequest
1 голос
/ 24 апреля 2009

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

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

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

Ответы [ 2 ]

5 голосов
/ 24 апреля 2009

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

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

0 голосов
/ 24 апреля 2009

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

- (void)setView:(UIView *)view
{
  [super setView:view];
  if (view == nil)
  {
    // Release-and-nil any subviews that you might be retaining.
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...