iPhone - Использование self = [super init] при сбое [super init] - PullRequest
2 голосов
/ 03 марта 2012

Какая разница между:

// 1
-(id) init {
    self = [super init];
    if (self) {
        ... do init ....
    }
    return self;
}

// 2 - I guess it's exactly the same as previous
-(id) init {
    if (self = [super init]) {
        ... do init ....
    }
    return self;
}

// 3 - is this one a really bad idea and if yes, Why ?
-(id) init {
    self = [super init];
    if (!self) return nil;

    ... do init ....

    return self;
}

// 4 - I think this one sounds OK, no ? But what is returned... nil ?
-(id) init {
    self = [super init];
    if (!self) return self;

    ... do init ....

    return self;
}

РЕДАКТИРОВАТЬ: Добавлено благодаря Питеру М.

// 5 - I really like the readability of this one
-(id) init {
    if(!(self = [super init])) return self;  // or nil

    ... do init ....

    return self;
}

Ответы [ 5 ]

4 голосов
/ 03 марта 2012

они все делают одно и то же, но первый обычно используется, потому что яблоко предложило

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

3 голосов
/ 03 марта 2012
  1. Общий, используемый Apple
  2. То же самое, но компилятор не знает, имели ли вы в виду == вместо =. Вы можете заблокировать предупреждение с помощью другого (...) вокруг выражения, но его нелегко прочитать.
  3. Этот вариант предпочтителен любыми хорошими стандартами кодирования (обычно не в виде однострочника, а с нарукавниками). Когда ваш код инициализации длинный, он значительно увеличивает читабельность.
  4. Так же, как 3, но вы теряете некоторую читаемость. Возвращение nil облегчает понимание кода (возможно, это только мое мнение, кто-то еще может сказать, что 4 лучше, чем 3).

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

Вы можете использовать 4 вместо 3, но не смешивайте 3 и 4 в своем коде.

1 голос
/ 03 марта 2012

Добавить в драку .. Я предпочитаю:

if(!(self = [super init]) ) return self;

Хранение всего этого в одной строке и никаких предупреждений в XCode 4.2: D

1 голос
/ 03 марта 2012

И 1, и 2 легче читать, чем 3 и 4, также потому, что они используются в коде Apple; многие разработчики привыкли к 1 и 2.

Число 4 и 3 совпадают, как если бы !self оценивается как истина, тогда это означает, что self равно nil, поэтому утверждение return self равнозначно return nil. Некоторые люди скажут, что у вас не должно быть нескольких точек выхода (возвратов) в методе, но в действительности наличие нескольких операторов возврата может сократить количество операторов if (что уменьшает читабельность)

Номер 2 встречается часто, однако в последних версиях xcode вы получите предупреждение компилятора, если и оператор if содержит один = (столько раз, сколько это опечатка, если вы намеревались использовать == для сравнения BOOL значений). Чтобы заглушить это предупреждение, вы должны заключить оператор в квадратные скобки, поэтому вместо if (foo = bar) вы получите if ((foo = bar))
Но Apple, должно быть, поняла, что Number 2 используется очень часто, и они добавили исключение из правила, поэтому его использование теперь не вызовет предупреждения компилятора.

Поскольку Номер 2 является исключением из правила, вам не следует его использовать. Таким образом, это делает номер 1 предпочтительным методом.

1 голос
/ 03 марта 2012

1 предлагается просто потому, что понятно.

2 работает, но это просто плохая практика. Не встраивайте логику в свои условные выражения, если это не нужно.

3 у меня болит голова. Как правило, вы хотите избежать отрицательных проверок, если можете.

4 такой же, как 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...