2014-11-25 9 views
2

Я работаю с учебниками по объективному c и заметил, что код в viewDidLoad помещен под супер viewDidLoad, а не первый вызов viewDidLoad.viewDidLoad vs call super viewDidLoad

В чем разница между помещением кода под viewDidLoad и под супер viewDidLoad.

Я понимаю, что вызов супер - это вызов суперкласса, но не уверен, что это в этом контексте.

Оцените справку.

+0

Можете ли вы добавить образцы кода? Я не уверен, что вы имеете в виду, говоря «под». – bert

+0

Все, что делает супер, это вызов реализации суперкласса метода, как вы сказали в своем вопросе. Это цель «супер». –

+0

bert, я просто имел в виду, что в вашем классе obj-c сначала есть viewDidLoad(), а затем супер viewDidLoad прямо под ним. Код может идти между ними, то есть под первым вызовом viewDidLoad, а не под супер viewDidLoad, или как часть реализации super viewDidLoad. – cheznead

ответ

5

Стандартная практика в iOS - это выполнить всю настройку вашего подкласса после того, как суперкласс завершит настройку, которую он должен выполнить (инициализация свойств, прокладка вещей и т. Д.). Если вы не дадите суперклассу возможность обрабатывать все его настройки, прежде чем вы начнете менять ситуацию, возможно, вы столкнетесь с некоторыми странными ошибками и поведением.

+0

Есть причины иметь код в методе перед вызовом супер - но пока вы действительно не знаете, что делаете, я абсолютно согласен! – dogsgod

2

В чем разница между помещением кода под viewDidLoad и под супер viewDidLoad?

Порядок выполнения. Ваша реализация будет выполнена после выполнения (-ов) суперкласса. Некоторые реализации ничего не делают (детализация должна быть абстрагирована), но их не повредит (исключения должны быть задокументированы).

Если вы ищете конкретные различия, которые могут сильно различаться в зависимости от иерархии классов. Вы должны просто игнорировать эти детали реализации. Достаточно сказать, что реализации суперкласса могут быть не готовы обрабатывать вашу инициализацию до тех пор, пока реализация суперкласса не будет выполнена.

Эмпирическое правило (исключения должны быть документально оформлены):

  • При инициализации/установки, запуска реализации суперкласса первым.
  • При разрыве/очистке запустите исполнение суперкласса последним.
  • Для других категорий вы, как правило, хотите сначала реализовать реализации суперкласса.

Обратите внимание на симметрию первых двух точек в ваших реализациях. Кроме того, реализация суперкласса не сможет обрабатывать ваши запросы (правильно) после запуска реализации суперкласса.

Detailing super: Ваши объекты существуют в иерархии объектов. Суперкласс - это объект, из которого вы получили. Пример:

NSObject > 
UIResponder > 
UIViewController > 
UICollectionViewController 

Предположим UICollectionViewController реализован -viewDidLoad. Его реализация вызовет реализацию super, чтобы гарантировать выполнение всех реализаций в иерархии классов. Это похоже на инициализацию - когда инициализатор суперкласса вызывается в инициализаторах, гарантируя, что все инициализаторы в иерархии классов выполняются в правильном порядке. Аналогично, -dealloc выполняется в обратном порядке (в ARC компилятор добавляет вызов к [super dealloc] после выполнения вашей реализации).