Лучшие практики для освобождения оставшихся просмотров? - PullRequest
4 голосов
/ 14 августа 2011

Это правильный (лучший?) Способ освободить представления, сохраненные в viewDidLoad, в iOS 4.x или ниже? Есть что-нибудь еще, чтобы рассмотреть?

- (void) viewDidUnload
{
    [super viewDidUnload];
    [self releaseViews];
}

- (void) dealloc {
    [self releaseViews];
    [super dealloc];
}

#define SAFE_RELEASE(a) [a release]; a = nil;

- (void) releaseViews {
    SAFE_RELEASE(myView1);
    SAFE_RELEASE(myView2);
    SAFE_RELEASE(myView3);
}

Ответы [ 3 ]

5 голосов
/ 14 августа 2011

-dealloc является верным, и -viewDidUnload будет работать, но обычно сохраненные представления обнуляются только в -viewDidUnload и не освобождаются. Это похоже на практику Apple, и именно это они запекли в Xcode, когда вы создаете автоматически сгенерированный IBOutlet через редактор Assistant.

Для автоматически сгенерированных IBOutlets автоматически сгенерированное -viewDidUnload выглядит следующим образом:

- (void)viewDidUnload {
    [self myView1:nil];
    [self myView2:nil];
    [self myView3:nil];
    [super viewDidUnload];
}

Кроме того, из Apple Docs на -viewDidUnload:

Предпочтительный способ отказаться от владения любым объектом (в том числе в торговых точках) - использовать соответствующий метод доступа, чтобы установить значение объекта равным nil. Однако, если у вас нет метода доступа для данного объекта, вам, возможно, придется освободить объект явно

Итак, поехали. Если у вашей торговой точки есть свойство, связанное с ней (что они все должны больше), то обнулите его в -viewDidUnload - но не отпускайте его. Это имеет смысл, если учесть, что на самом деле происходит в синтезированном методе доступа; код выглядит примерно так:

- (void) setMyView1 : (UIView *) view {
   if (myView1) // the associated IVAR is already set
      [myView1 release];

   myView1 = [view retain];
}

Как видите, установка свойства синтеза на nil неявно освобождает сохраненный объект.

Также из документов по -dealloc:

Если вы реализуете этот метод, но создаете свое приложение для iOS 2.x, ваш метод dealloc должен освободить каждый объект, но также должен установить ссылку на этот объект на nil перед вызовом super.

Если вы не поддерживаете iOS2.x, нет необходимости устанавливать объекты равными nil в dealloc.

Итак, подведем итоги документов Apple относительно -viewDidUnload и -dealloc:

  • В -viewDidUnload, нулевые свойства (включая свойства IBOutlet), но не освобождает их
  • В -dealloc освобождать свойства, но не обнулять их (если не собирается сборка для 2.x).
1 голос
/ 14 августа 2011

Я не уверен, что это лучший способ, но это правильный способ сделать это, если вы сохранили эти представления в viewDidLoad.

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

0 голосов
/ 14 августа 2011

Не делайте этого в viewDidUnload, если вы не воссоздаете их в viewDidLoad или они не являются IBOutlets.Полезная информация здесь и здесь .

...