В примере с прокруткой Apple они не называют это. Я всегда думал, что нужно. Почему я должен так звонить?
Всегда ли мне нужно вызвать [super viewDidLoad] в методе -viewDidLoad?
Ответ 1
Если вы переопределяете метод, вы все равно должны вызвать метод в супер. Даже если суперкласс сегодня ничего не делает с этим, Apple может однажды изменить реализацию, и ваш код загадочно перестанет работать. Если вам действительно не нужно что-либо делать в этом методе, полностью оставьте его вне вашего кода, и супер-метод будет работать как обычно, без каких-либо вмешательств с вашей стороны.
Ответ 2
Нет, вам не нужно вызывать [super viewDidLoad]. Изменить: Но читайте ниже, потому что я думаю, что вы определенно должны.
Позвольте быть реальным: Apple не собирается разбивать тысячи приложений, в том числе основанных на их опубликованном образце кода, путем принятия решения о том, какое событие они не обрабатывают в настоящее время, внезапно должно сделать то, что разработчики могут или не захотят остановить, и это важно, если вам не нужно различное поведение, вы не останавливаете событие.
Изменить: Наблюдая за тем, как Apple обрабатывает совместимость в течение дополнительного года, я теперь рекомендую изучить и использовать правильный шаблон. Хотя я сомневаюсь, что ваш прикладной двоичный код когда-либо внезапно перестанет работать, ясно, что iPhone обнаруживает, какой SDK был создан для вашего двоичного кода, и изменяет поведение ОС на этом основании.
В один прекрасный день Apple может потребовать, чтобы какой-то конкретный шаблон выполнялся в будущем SDK. Это не повлияет на вас, пока вы не перестроетесь с последним Xcode + SDK, но тогда вы получите эти перерывы без изменений исходного кода. Изучите и соблюдайте шаблон, чтобы быть в безопасности.
Ответ 3
Как говорит Маркус, UIViewController ничего не делает в своем методе viewDidLoad, поэтому вам не нужно его вызывать. Тем не менее, это хорошая привычка вступать, если вы измените структуру наследования и вдруг класс, который наследовал от UIViewController, теперь наследуется от чего-то, что делает что-то в методе viewDidLoad.
Ответ 4
Документация Apple для viewDidLoad НЕ заявляет, что вы должны называть [super viewDidLoad], поэтому я бы пошел с тем, что Apple говорит. Обратите внимание, однако, что для других подобных методов, таких как viewDidAppear, вы должны вызвать [super viewDidAppear].
Ответ 5
Допустим, у вас есть 2 класса, родитель и ребенок. Ребенок наследует от родителя. У них есть метод greet, который возвращает строку.
Вот как выглядит родительский метод:
код:
-(NSString *)greet {
return @"Hello";
}
Мы хотим, чтобы ребенок учился у своих родителей. Поэтому мы используем супер, чтобы приветствовать, как мама будет приветствовать, но и с нашими собственными небольшими дополнениями.
код: // Унаследовано от родителя
-(NSString *)greet {
NSString *parentGreeting = [super greet];
return [parentGreeting stringByAppendingString:@", Mommy"]
}
Итак, теперь Parent приветствует "Hello", а Child приветствует "Hello, Mommy". Позже, если мы изменим родительский привет, чтобы вернуть только "Привет", тогда оба класса будут затронуты, и у вас будут "Привет" и "Привет, мама".
super используется для вызова метода, определенного суперклассом. Он используется для доступа к методам, которые были переопределены подклассами, чтобы класс мог обернуть свой собственный код вокруг метода, который реализует его родительский класс. Это очень удобно, если вы вообще ничего не наследуете.
Ответ 6
Вам не нужно вызывать [super viewDidLoad]
Насколько я знаю, viewDidLoad в суперклассе (UIViewController) - это только пустая функция, которая вызывается при инициализации ViewController с помощью файла nib.
Итак, если вам нужно выполнить любую инициализацию, вы должны переопределить эту функцию и поместить там свой код.
Ответ 7
Только что заметил, что статический анализатор Xcode 6 выдает предупреждение, если вы не вызываете super в этих функциях. Поэтому кажется, что Apple теперь определенно хочет, чтобы мы это называли.
Ответ 8
Хотя в xCode 7 Beta/Swift 2 super.viewDidLoad не будет компилироваться. Ошибка говорит, что она доступна только в osx 10.10, и авто-исправление делает это
if #available(OSX 10.10, *){
super.viewDidLoad()}
else
{
// Fallback on earlier versions
}
// My code
}