Имеет ли значение время вызова метода суперкласса в ObjectiveC? - PullRequest
6 голосов
/ 17 июня 2009

Имеет ли значение, если я вызываю метод суперкласса первым делом или в конце? Например

-(void)didReceiveMemoryWarning {
   /* do a bunch of stuff */

   [super didReceiveMemoryWarning];
}

против

-(void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];

   /* do a bunch of stuff */
}

тот же вопрос для других методов, таких как viewWillAppear, willRotateToInterfaceOrientation и т. Д.

Я ищу значимые различия, не только стилистические или философские (хотя они тоже приветствуются).

Ответы [ 2 ]

6 голосов
/ 17 июня 2009

Типичная конвенция какао:

  1. Если вы выполняете настройку, позвоните супер ПЕРВЫЙ
  2. Если вы выполняете срыв, звони супер ПОСЛЕДНИЙ

Итак, инициализация, viewDidLoad и т. Д. Подпадают под первый случай. Предупреждения памяти, viewDidUnload и dealloc подпадают под второй случай.

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

Схожий SO ответ:

`[super viewDidLoad]` соглашение


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

Это имеет смысл в отношении обновлений пользовательского интерфейса, а также в комментариях ниже.

6 голосов
/ 17 июня 2009

Это зависит от функциональности, вы либо хотите сделать что-то после того, как суперкласс сделал свое дело, либо раньше.

Например, если суперкласс содержит некоторые элементы пользовательского интерфейса, и вы расширяете его, и ваш класс будет содержать еще несколько элементов пользовательского интерфейса. Чтобы размер соответствовал вашему целому объекту, вы, вероятно, вызвали бы суперкласс для вычисления размера его элементов, а затем добавили к этому размеру размер добавленных вами элементов.

В противном случае это не имело бы смысла - суперкласс не знает о ваших элементах, поэтому он перезаписывает ваши вычисления. Опять же, это зависит от реализации.

В конкретном случае вам нужно вызвать метод super как последнюю вещь:

-(void)dealloc
{
    ...
    [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...