Xcode不会警告无效的init方法

时间:2010-11-02 19:45:07

标签: objective-c xcode compiler-construction

我刚刚注意到,如果你尝试在与alloc语句相同的行上调用一个不存在的init方法,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 个答案:

答案 0 :(得分:3)

首先,有趣的问题!

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,你能测试一下吗?

[编辑] 刚刚用xcode测试了它。同样的行为。