2011-03-22 37 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中可以改變。

相關問題