Нужно ли выпускать IBOutlets в dealloc? - PullRequest
1 голос
/ 21 января 2011

У меня есть View Controller как часть стека навигационных контроллеров с двумя IBOutlets. В ViewDidUnload я освобождаю их:

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

Но у меня все еще была утечка. Поэтому я вставил сообщения о выпуске в dealloc для них:

- (void)dealloc
{
    [myView1 release];
    [myView2 release];

    [super dealloc];
}

Похоже, что это устраняет утечку памяти. Однако мне всегда говорили, что я должен только выпустить ивары, которые я создал, используя alloc, copy или new. Так что я обеспокоен тем, что эти два релиза будут здесь. Это правильно или неправильно? Может кто-нибудь объяснить мне, потому что я продолжаю получать противоречивые мнения ... Спасибо!

Ответы [ 3 ]

8 голосов
/ 21 января 2011

Если любой из ваших @property объектов объявлен retain или copy, вам необходимо освободить их в dealloc.Это включает в себя ваши розетки.

1 голос
/ 21 января 2011

Базовый, безопасный шаблон:

  • объявить ивара
  • объявить свойство IBOutlet для ivar
  • отпустить свойство в dealloc
  • только эталонное свойство, никогда ivar

xib устанавливает свойство, которое освобождает то, что могло быть там первым.

Я немного сбит с толку, почему произошла эта утечка. Установка свойства в ноль должна освободить старую ссылку. Возможно, viewDidUnload даже не вызывали? Вы уверены, что вам даже нужно viewDidUnload?

1 голос
/ 21 января 2011

Используя IBOutlet, переменные открываются для подключения в Интерфейсном Разработчике и распределяются при инициализации контроллера представления. Таким образом, они должны быть освобождены и освобождены, поскольку контроллер представления выгружен и освобожден. Поскольку большинство IBOutlets сохраняют свойства UI *, это необходимо.

Присвоение nils переменным технически не освобождает. Это просто последнее состояние, в котором сохраняется счетчик 0 перед тем, как его фактически освободить.

Также обратите внимание, что на них ссылаются, используя self. Это означает, что ссылки из контроллера представления становятся нулевыми, а не выделения.

Итак, в заключение, свойства IBOutlet должны быть освобождены в dealloc ()

(Хотя я вполне уверен, кто-то другой может дать 100% правильный ответ на это.)

...