Прежде всего, интересный вопрос!
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. Такое же поведение.