Подтвердить что ты не робот

Исправить [super dealloc]

Является ли порядок высказываний в методе dealloc? Требуется ли [super dealloc] в верхней части метода? Это имеет значение?

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

4b9b3361

Ответ 1

Это АБСОЛЮТНО.

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

Использование ручного отпускания-сохранения

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

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

Итак, ваш код должен выглядеть так:

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

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

[super dealloc];
[member release];

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

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

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

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

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

См. также:

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

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

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

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

См. также:

Ответ 2

Является ли порядок высказываний в методе dealloc? Должен ли [super dealloc] быть наверху метода? Это имеет значение?

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

Также, например, в viewDidLoad. Должно ли [super viewDidLoad] находиться в верхней части метода?

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