2011-03-22 34 views
0

我使用Xcode 4,定义了一个简单的类接口,并将NSTableViewDelegate和NSTableViewDataSource协议添加到接口定义中。即, @interface富:NSObject的< NSTableViewDelegate,NSTableViewDataSource>当协议方法没有被指定时,为什么我不会收到警告?

在我的构建设置,我已经证实,选择“未完成的Objective-C协议”警告启用(用于调试/任何建筑等),我应该得到NSTableViewDataSource协议所需的非可选方法的编译时警告。然而,我根本没有得到任何警告,但是在运行时我看到日志中的消息中没有定义方法。

任何人都知道为什么?

+0

那么至少委托协议是非正式的,所以不实施的方法应该仍然让代码工作,这意味着你不必实现,这就是为什么你不会得到这样的警告。 – 2011-03-22 22:45:41

+0

某些方法是必需的---这就是为什么我应该在编译时应该得到警告,而不是在运行时。 我不喜欢只是得到运行时警告,如果我可以有编译时警告。所以问题是这是否是一个xcode4错误或者是否有其他事情正在阻止编译时产生警告。 – David 2011-03-23 01:52:20

+0

你可以很容易找到:在XCode3中试试这个。 – 2011-03-23 08:17:24

回答

3

如果你看看苹果的NSTableView.h,你会SE这样的:

@protocol NSTableViewDataSource <NSObject> 
@optional 

/* Required Methods 
*/ 
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView; 
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)ta bleColumn row:(NSInteger)row; 
... 

所以注释和文件要求所需的方法,但代码表示,他们不是。编译器最终完全忽略了所有的评论和文档。 ;)因此你没有得到编译器警告。

我想这是他们的意图,使这两种方法需要(会有很大的意义),但发现他们自己的代码很多依赖于它仍然是一个非正式的协议。因此,我认为他们决定暂时不要求改变他们的需求,而不是改变所有遗留代码。我希望这在Lion中可以改变。

相关问题