Xcode не предупреждает о недопустимых методах инициализации - PullRequest
4 голосов
/ 02 ноября 2010

Я только что заметил, что если вы попытаетесь вызвать несуществующий метод init в той же строке, что и оператор alloc, XCode не предупредит вас об этом.

NSString *string = [[NSString alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
UIView *view = [[UIView alloc] initWithCapacity:0];

Нет предупреждений ни для одной из этих строк кода. Теперь, я думаю, это потому, что «alloc» фактически возвращает id, а не статический тип. Однако, когда я начинаю набирать «init», XCode дает мне опции автозаполнения, которые включают только методы init для правильного типа. Итак, если он использует мою статическую типизацию в начале строки, чтобы дать мне опции автозаполнения, почему он также не использует это, чтобы дать мне предупреждение? Это настройка где-то в XCode, которую можно включить?

Очевидно, что это не имеет большого значения для явно неправильных вещей, таких как эти примеры, но для некоторых объектов это может привести к ошибкам во время выполнения из-за опечаток или забывчивости изменить одну вещь, когда вы меняете другую. Я также мог бы получить предупреждение компилятора, разделив методы alloc и init на две разные строки кода, но я никогда не видел, чтобы это было сделано; Я всегда учился использовать одну строку кода для alloc и init.

1 Ответ

3 голосов
/ 03 ноября 2010

Прежде всего, интересный вопрос!

XCode использует вывод gcc для создания списка предупреждений и ошибок и некоторый другой (внутренний) механизм для создания списка предложений автозаполнения. Автозаполнение иногда бывает умнее (а иногда нет):

Но почему gcc не выдает предупреждение? У вас уже есть ответ - alloc возвращает id.

Мой ответ не является «ответом», но я хочу поделиться с вами следующим. (Извините, у меня нет Mac на данный момент, так что это не цель Apple-c)

shum@shum-laptop:/tmp/shum$ cat test.m 

#import <objc/Object.h>

@interface Test1 : Object
{
}

- (id) blah;

@end

@interface Test : Object
{
}

@end

@implementation Test

@end

int main()
{
  Test* test = [[Test alloc] blah];
  return 0;
}

shum@shum-laptop:/tmp/shum$ gcc test.m -lobjc
shum@shum-laptop:/tmp/shum$ 

Без предупреждения. Но попробуйте прокомментировать - (id) blah в Test1 интерфейсе

shum@shum-laptop:/tmp/shum$ gcc test.m -lobjc
test.m: In function ‘main’:
test.m:24: warning: no ‘-blah’ method found
test.m:24: warning: (Messages without a matching method signature
test.m:24: warning: will be assumed to return ‘id’ and accept
test.m:24: warning: ‘...’ as arguments.)
shum@shum-laptop:/tmp/shum$ 

Можно сделать вывод: если вы произвели опечатку, вызывающую init, и нет селектора с таким именем, тогда gcc должен предупредить вас; в плохом случае, когда где-то существует селектор с таким же именем, gcc не предупредит вас. У меня нет Mac и XCode в данный момент, не могли бы вы проверить это?

[EDIT] Только что проверил это с помощью xcode. Такое же поведение.

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