2012-03-02 1 views
2

Что такое различие Разногласия между:iPhone - использование самости = [супер INIT], когда [супер INIT] не

// 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; 
} 

EDIT: Добавлена ​​благодаря Петру М.

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

    ... do init .... 

    return self; 
} 

ответ

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

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

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

4

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

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

1

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

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

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

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

+0

Избегайте негативные проверки? Зачем? 3 будет фактически рекомендован любыми стандартами кодирования. – Sulthan

+0

Sulthan, можете ли вы указать мне на любой ресурс? С моей точки зрения, если Apple не решила использовать 3, вполне вероятно, что нам будет лучше. ;-) – joshis

+0

Вы когда-нибудь читали примеры Apple? :) Их код часто абсолютно нечитабельен, поэтому я бы никогда не посмел сказать «Apple его использует, вот почему это лучше». Я не могу предоставить никаких ссылок. Стандарты кодирования обычно основаны на опыте людей, и я не мог найти ни одного, который мог бы охватить эту тему. Вы бы вложили весь элемент функции/метода в один оператор 'if'? Почему метод 'init' должен быть особенным? – Sulthan

1

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

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

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

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

1

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

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

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