Когда вызывать [super viewDidLoad] и [super viewDIdUnload]?

В большей части моего кода у меня есть следующие настройки для viewDidLoad и viewDidUnload:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //do stuff...
}

- (void)viewDidUnload
{
    [super viewDidUnload];

    //do stuff...
}

Однако мне стало интересно ... имеет ли значение, когда вы вызываете viewDidLoad и viewDidUnload? Должен ли каждый быть до или после того, как я «делаю что-нибудь»?

Другими словами, каждый должен быть в начале или в конце метода?

Изменить: чтобы еще больше усложнить ситуацию, это метод Apple viewDidUnload по умолчанию, который «кажется» предлагает сначала вызвать [super viewDidUnload] ...

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

person MikeS    schedule 11.10.2012    source источник
comment
Схема скорее такова, что суперконструктор нужно вызывать первым, а супердеструктор - последним.   -  person    schedule 11.10.2012
comment
Это зависит от того, считаете ли вы, что ваш код должен выполняться до того, как класс super выполнит свои операции. В этой ситуации просто позвоните сначала. Раньше ARC [super dealloc] вызывался последним, потому что не имеет смысла (неопределенное поведение) работать с классом после того, как super его уничтожит.   -  person Joe    schedule 11.10.2012


Ответы (2)


Я вызываю super последним в деструкторах и первым в конструкторах. viewDidUnload - это своего рода деструктор, поэтому я бы назвал его последним. Но в данном случае дело вкуса.

Кроме того, небольшое примечание - viewDidUnload устарел с iOS 6.

person zrzka    schedule 11.10.2012
comment
Так что это дело вкуса и вообще не имеет значения? Я думал, что, может быть, он тоже должен быть последним ... НО в методе ViewDidLoad по умолчанию Apple выглядит так, будто он должен быть первым ... - person MikeS; 11.10.2012
comment
@MikeS Нет. Этот «конструктор» всегда нужно вызывать первым. Деструктор зависит от - если суперкласс действительно освобождает объекты внутри, то его вызов первым вызовет UB, поэтому я предлагаю вызывать его последним. - person ; 11.10.2012
comment
Ага, назовите его первым в viewDidLoad и последним в viewDidUnload, и вы будете в безопасности. Но не имеет значения, первая она или последняя в viewDidUnload. - person zrzka; 11.10.2012
comment
Я определенно понимаю рассуждения, но есть ли по этому поводу документация? Опять же, похоже, что в Apple метод [super viewDidUnload] вызывается первым (обновлено мое сообщение, чтобы показать метод Apple по умолчанию). Тем не менее, здравый смысл, кажется, говорит, что вызовите его последним. - person MikeS; 11.10.2012
comment
Простое правило - если это важно, вы всегда найдете информацию в документации, если вы должны или не должны звонить super. Но я не могу вспомнить ни одного метода, в котором порядок упоминается в документации (кроме constructor, который всегда стоит первым). - person zrzka; 11.10.2012
comment
Хм, хорошо. Пытался отследить странную ошибку, и я думаю, что это, вероятно, не имеет к ней никакого отношения, но я все равно кое-что узнал! - person MikeS; 11.10.2012
comment
Не задумывайтесь ... Просто используйте первый / последний в конструкторе / деструкторе, и вы всегда будете в безопасности. - person zrzka; 11.10.2012
comment
Я согласен с общим утверждением Роберта. Но бывают случаи, когда имеет смысл назвать «супер» в середине или другом порядке. Но это будет сделано только тогда, когда у вас будет для этого особая причина. Моя логика обычно такова: если мой код зависит от того, что делает «super», я сначала вызываю super. Если мой код должен быть написан до «super», то, конечно, я называю super последним. Вероятно, существует гораздо больше примеров вызова super первым, чем последним. Единственные примеры «последнего», которые я могу придумать, - это viewDidUnload и dealloc. И в наши дни они в основном устарели. - person rmaddy; 12.10.2012
comment
Да, но эти случаи специфичны. Я не всегда вызываю super в init..., потому что я проверяю аргументы, пытаюсь создать другие объекты, ... а затем вызываю super init..., когда это удается. НО важно, что вы написали - вы не должны полагаться на super, пока не позвоните super init.... - person zrzka; 12.10.2012

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

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

Код:

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

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

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

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

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

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

person Kishore Suthar    schedule 09.03.2015