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

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

Ответы [ 8 ]

49 голосов
/ 05 мая 2009

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

29 голосов
/ 11 сентября 2009

Нет, вам не нужно для вызова [super viewDidLoad]. Редактировать: Но читайте ниже, потому что я думаю, что вы определенно должны .

Давайте будем реальными: Apple не собирается ломать тысячи приложений, в том числе основанных на опубликованном образце кода, решая, что событие, которое они в данный момент не обрабатывают, внезапно должно сделать что-то, что разработчики могут или не могут захотеть остановитесь, и очень важно, чтобы, если вам не нужно другое поведение, вы не останавливали событие.

Редактировать: Посмотрев, как Apple справляется с совместимостью в течение дополнительного года, я рекомендую изучить и использовать правильный шаблон. Хотя я сомневаюсь, что бинарный файл вашего приложения когда-нибудь внезапно перестанет работать, ясно, что iPhone определяет, какой SDK был создан из вашего бинарного файла, и изменяет поведение некоторых ОС на основании этого.

Apple может однажды потребовать соблюдения определенного паттерна в будущем SDK. Это не повлияет на вас, пока вы не перестроите с последним Xcode + SDK, но тогда вы получите эти перерывы без каких-либо изменений исходного кода. Учитесь и следуйте шаблону, чтобы быть в безопасности.

17 голосов
/ 05 мая 2009

Как говорит Маркус, UIViewController ничего не делает в своем методе viewDidLoad, поэтому вам не нужно его вызывать. Тем не менее, это хорошая привычка, если вы изменяете структуру наследования и вдруг класс, который раньше наследовал от UIViewController, теперь наследует от чего-то, что делает что-то делает в методе viewDidLoad.

11 голосов
/ 21 октября 2014

Допустим, у вас есть 2 класса, родитель и ребенок. Ребенок наследует от родителя. У них есть метод greet, который возвращает строку.

Вот как выглядит родительский метод:

Код:

-(NSString *)greet {
   return @"Hello";
}

Мы хотим, чтобы ребенок учился у своих родителей. Поэтому мы используем супер, чтобы сказать «приветствуй», как мама будет приветствовать, но и с нашими небольшими дополнениями.

Код: // Наследуется от Parent

-(NSString *)greet {
  NSString *parentGreeting = [super greet];
  return [parentGreeting stringByAppendingString:@", Mommy"]
}

Итак, теперь Родитель приветствует «Привет», а Ребенок - «Привет, мамочка». Позже, если мы изменим приветствие родителя, чтобы оно возвращало просто «Привет», то это повлияет на оба класса, и у вас будут «Привет» и «Привет, мамочка».

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

10 голосов
/ 14 февраля 2011

В документации Apple для viewDidLoad НЕ указано, что вам следует вызывать [super viewDidLoad], поэтому я бы согласился с тем, что говорит Apple. Однако обратите внимание, что для других подобных методов, таких как viewDidAppear, вы должны вызвать [super viewDidAppear].

9 голосов
/ 05 мая 2009

Вам не нужно вызывать [super viewDidLoad]

Насколько я знаю, viewDidLoad в суперклассе (UIViewController) - это только пустая функция, которая вызывается, когда ViewController инициализируется с помощью nib-файла.

Так что, если вам нужно выполнить какую-либо инициализацию, вы должны переопределить эту функцию и поместить туда свой код.

5 голосов
/ 06 июля 2014

Просто заметил, что статический анализатор Xcode 6 выдает предупреждение, если вы не вызываете super в этих функциях. Так что, похоже, теперь Apple определенно хочет, чтобы мы это называли.

0 голосов
/ 20 июня 2015

Хотя в xCode 7 Beta / Swift 2 super.viewDidLoad не скомпилируется. Ошибка говорит, что это доступно только в OSX 10.10, и авто-исправление делает это

if #available(OSX 10.10, *){
super.viewDidLoad()}
else
{
// Fallback on earlier versions
}
// My code
}
...