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

Всегда ли мне нужно вызвать [super viewDidLoad] в методе -viewDidLoad?

В примере с прокруткой Apple они не называют это. Я всегда думал, что нужно. Почему я должен так звонить?

4b9b3361

Ответ 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
}