Мне нужно вызвать [super viewDidUnload]?

Я видел несколько примеров Apple, которые вызывают [super viewDidUnload];, а некоторые - нет. Я прочитал статью (несколько месяцев назад, поэтому я не помню URL-адрес), в которой говорилось, что вызов [super viewDidUnload]; был ненужным, но не объяснял, кроме этого.

Есть ли веская причина, почему или почему не сказать super, что viewDidUnload?
И (если это должно быть сделано) я вызываю super перед установкой всех моих свойств на nil, после, или это имеет значение?

- (void)viewDidUnload {
    // Is this necessary?
    // [super viewDidUnload];

    self.tableDataSource = nil;
    self.titleLabel = nil;

    // Is it better to call super before or after nil'ing properties?
    // [super viewDidUnload];
}

Спасибо!


person chown    schedule 11.10.2011    source источник
comment
После ответа я понял, что есть по крайней мере несколько возможных дубликатов: [super viewDidLoad] Convention Всегда ли мне нужно звонить [super viewDidLoad] [super viewDidUnload] заказ на звонок   -  person jscs    schedule 11.10.2011
comment
@JoshCaswell Хороший улов, клянусь, я сделал несколько поисков, прежде чем спросить, не уверен, как я все это пропустил.   -  person chown    schedule 11.10.2011
comment
На мой взгляд, это не имеет большого значения - вопросы, связанные с дизайном / процедурой, обычно собирают интересные новые лакомые кусочки при дублировании (в отличие от вопроса «Почему мой массив не работает?»). Конечно, все же неплохо собрать все эти лакомые кусочки в одном месте. К тому же ваш вопрос довольно хорошо написан.   -  person jscs    schedule 11.10.2011


Ответы (2)


1- Есть ли веская причина, почему или почему не сказать super, что viewDidUnload?

Честно говоря, я не знаю, к чему это приведет, если я не позвоню. Вы можете попытаться не вызывать его, и все работает гладко, но представьте, что Apple добавляет какой-то важный фрагмент кода, который будет запускаться при вызове [super viewDidUnload], что теперь произойдет? Скорее всего, случатся плохие вещи, и вы потратите драгоценное время, пытаясь решить свою проблему. Мое правило: при переопределении звонить супер.

2 - Я вызываю super перед установкой всех моих свойств на ноль, после или это имеет значение?

Это имеет значение, я наблюдал, как случаются неприятности, когда я звонил [super dealloc] перед тем, как выпустить свои объекты. Точно так же я увидел, что мой пользовательский интерфейс работает медленно, потому что я делал свои расчеты до [super viewDidLoad]. Это всегда зависит от того, чего вы хотите достичь.

Итог, что я делаю в своих проектах для viewDidUnload:

// освобождаем мои просмотры

[супер viewDidUnload];

Что касается iOS6:

Этот метод устарел.

person Rui Peres    schedule 11.10.2011
comment
[Что, если] Apple добавит какой-то важный фрагмент кода, который будет запускаться при вызове [super viewDidUnload], что будет теперь? - Это очень хороший момент, который до сих пор не приходил мне в голову. - person chown; 11.10.2011
comment
Это хорошая мысль, хотя Точка зрения Стивена Фишера, вероятно, верна, что Apple вряд ли вырвет у нас почву из-под ног таким образом. @chown - person jscs; 11.10.2011
comment
Джош, это я называю спекуляцией. Он, наверное, прав, но я бы не стал за это бросать руку в огонь ... - person Rui Peres; 11.10.2011
comment
Я бы тоже не стал; практически нет затрат на включение [super viewDidUnload]Пол Томблин говорит еще лучше о том, почему вам следует это сделать - на случай, если вы по какой-то причине измените суперкласс), но я думаю, что хорошо иметь ясную голову. - person jscs; 11.10.2011
comment
Не думайте, что этот метод устарел. Только что преобразовал проект в iOS 8 / 64bit, и Xcode отмечает отсутствие [super viewDidUnload] как «проблему». - person David; 27.07.2015

viewDidUnload похож на dealloc в том, что вы «закрываете» свой объект - вы освобождаете память и переводите его в (полу) неактивное состояние.

Рекомендуемый шаблон в Какао - сделать [super dealloc] в конце dealloc вашего подкласса, потому что вам нужно убедиться, что все вещи, которые вы добавили в класс, могут быть освобождены до того, как ваш экземпляр станет недействительным путем освобождения самого себя. Та же идея, хотя она, вероятно, не столь важна, применима к viewDidUnload.

В общем, при создании пусть сначала работает суперкласс. При разрушении пусть работает в последнюю очередь.

Вам не нужно отправлять [super deconstructionMethod] iff, реализация суперкласса ничего не делает. Я думаю, что это так для viewDidUnload, но я не уверен, и это как бы указывает на правильное направление: суперкласс непрозрачен для вас, поэтому, если он не задокументирован, его реализация ничего не делает, ты всегда должен звонить.

person jscs    schedule 11.10.2011
comment
Это было очень полезно, Джош, спасибо. Хотел бы я принять оба ответа. - person chown; 11.10.2011