Правильный [супер сделка] - PullRequest
       26

Правильный [супер сделка]

13 голосов
/ 31 декабря 2010

Имеет ли значение порядок операторов в методе dealloc? Должен ли [super dealloc] быть на вершине метода? Имеет ли это значение?

Также, например, viewDidLoad. Должен ли [super viewDidLoad] быть на вершине метода?

Ответы [ 2 ]

43 голосов
/ 31 декабря 2010

Это АБСОЛЮТНО имеет значение.

То, что вы делаете, зависит от того, используете ли вы автоматический подсчет ссылок (ARC) или ручной подсчет ссылок.

Использование ручного выпускаRetain

Manual Release-Retain (MRR) - это управление памятью по умолчанию для всех версий Mac OS X и единственный способ обрабатывать память до Xcode 4.2.

С MRR, [super dealloc] должнобыть на конце вашего метода.

Итак, ваш код должен выглядеть следующим образом:

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

Super dealloc фактически освобождает память,Подумай об этом.Если после этого вы получите доступ к переменной экземпляра, например:

[super dealloc];
[member release];

... это означает, что переменная экземпляра потенциально недопустима.Теоретически байты, в которых хранится указатель на член, могли бы быть заменены на вызовы super dealloc и вызовом освобождения члена!

Как Apple объясняет в Руководство по программированию управления памятью :

Роль метода dealloc заключается в освобождении собственной памяти объекта и удалении любых ресурсов, которые он содержит, включая владение любыми переменными экземпляра объекта.

Вы делаете это, распоряжаясь любыми ресурсами, которыми владеет ваш объект, и вызывая [super dealloc].Который располагает любые объекты, которые он держит, и называет его супер.И так далее, и так далее, пока в конечном итоге корневой объект не отметит память, используемую самим экземпляром, как свободную.Ко времени возврата [super dealloc] ваш экземпляр будет освобожден.(Конечно, указатели в нем , вероятно, действительны, но это деталь реализации, на которую не следует полагаться.)

Как правило, при построении (или загрузке) пусть super выполняетработать в первую очередь.При сносе делайте сначала свою работу.

См. Также:

  • dealloc , справочник классов по NSObject, библиотека разработчика Mac OS X
  • Отмена выделения объекта , владение и распоряжение объектом, Руководство по программированию управления памятью, Библиотека разработчика Mac OS X

С автоматическим подсчетом ссылок

Автоматический подсчет ссылок (ARC) - это новый способ управления памятью, представленный в Xcode 4.2.С ARC компилятор добавляет код управления памятью при компиляции вашего приложения.У него есть некоторые недостатки, о которых вы хотите прочитать больше (прежде всего, ограниченная совместимость со старыми версиями ОС).

С ARC вы не можете (и не можете) звонить [super dealloc] ввсе.Вместо этого [super dealloc] вызывается, когда заканчивается dealloc.

См. Также:

5 голосов
/ 31 декабря 2010

Имеет ли значение порядок операторов в методе dealloc? Должен ли [super dealloc] быть на вершине метода? Имеет ли это значение?

Это должно идти в конце. Идея состоит в том, чтобы сказать: «Я уничтожил все, что сделал, поэтому теперь я позволю своему родительскому классу делать то же самое» (рекурсивно)

Также, например, viewDidLoad. Должен ли [super viewDidLoad] быть на вершине метода?

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

...