#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. и это предупреждение было показано только без дополнительных круглых скобок