Должен ли init присваивать или проверять равенство при самостоятельном запуске?

#objective-c #facebook

#objective-c #Facebook

Вопрос:

Я клонировал из https://github.com/facebook/facebook-ios-sdk.git сегодня и заметил два места в коде, которые имеют эту конструкцию:

 (id) init {
    if ((self == [super init])) {
        ...
    }
}
 

Я ожидал self бы, что меня назначат здесь, а не проверят на равенство:

 (id) init {
    if ((self = [super init])) {
        ...
    }
}
 

или, по крайней мере,:

 (id) init {
    self = [super init];
    if (self) {
        ...
    }
}
 

Это внутри src/FBDialog.m и sample/Hackbook/Hackbook/DataSet.m .

(Извините, если это должно быть в баг-трекере вместо этого; не удалось найти способ фактически отправить что-либо там… :-/

Ответ №1:

Он должен назначить self , потому [super init] что может возвращать объект, отличный от self .

Проверка на равенство часто работает, но не требуется для работы. Вы всегда должны присваивать.

Я считаю, что последние версии clang даже выдают предупреждения при использовании == в этом конкретном случае.

Ответ №2:

Шаблон для нового класса Objective-C в XCode 3 раньше давал вам # 2 (за исключением того, что в скобках меньше скобок).

Кто-то, кто этого не понимал и думал, что это ошибка, изменил его на # 1.

Я думаю, Apple решила, что это сбивает с толку, поэтому теперь в XCode 4 шаблон дает вам # 3. На самом деле это дает предупреждение для # 2 (возможно, только без дополнительных круглых скобок).

Комментарии:

1. Предупреждение было удалено в последней версии clang, потому что это очень распространенное явление.

2. и это предупреждение было показано только без дополнительных круглых скобок