2011-01-25 73 views
2

目標C中似乎有兩種標準的書寫方法,我不能完全理解它們之間的區別以及爲什麼要使用而不是另一種。例如,從UIWebViewDelegate:這些Objective C方法樣式有什麼區別?

- (void)webViewDidFinishLoad:(UIWebView *)webView { 

} 

- (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 

} 

爲什麼不能簡單地寫成webViewDidFailLoadWithError第二個,或者爲什麼不是第一個匹配第二風格?

另一個例子,這一次從UITableViewDataSource:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 0; 
} 

爲什麼numberOfSectionsInTableView不遵循相同的格式,其他的方法?

對不起,如果這是一個非常簡單的問題 - 這只是一直在困擾我一會兒,我想在我的腦海裏清楚地說出來!

在此先感謝您的幫助。

回答

7

這一切都歸結爲參數的數量。幾乎每個委託方法都將方法的發送者作爲其第一個參數。如果該方法不需要更多參數,則方法簽名將處於第一種樣式,否則將在第二種方式中,按照Cocoa約定來命名每個參數。

不幸的是,在最後一個參數後面添加更多文本到方法簽名是不可能的。如果是這樣,我相信蘋果公司寧願將方法命名爲- (void) webView:(UIWebView *)webView didFinishLoad

編輯:有一個有趣的討論最近在這裏堆棧溢出在這句法決定的歷史:Why must the last part of an Objective-C method name take an argument (when there is more than one part)?,甚至布拉德·考克斯的Objective-C的創造者,幫腔

1

您可以同時在屏幕上顯示多個Web視圖或表格視圖。在您列出的方法的回調期間,您可以查看Web視圖或表格視圖'標記屬性以決定哪個Web視圖或表視圖負責此回調。

1

這是蘋果自己的一部分關於委託方法的Objective-C編碼指南: http://akos.ma/gt

委託方法(或委託方法)是那些對象在委託調用(如果委託實現了它們)當某些事件發生。它們具有獨特的形態,這同樣適用於對象的數據源調用的方法:通過識別類真實發送消息的對象的

  • 啓動名:
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row; 
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename; 

所以,要回答你的問題,你引用的所有方法都遵循相同的模式:方法的第一個(有時是唯一的)參數是調用委託方法的對象。

1

爲什麼不是第二個簡單寫成webViewDidFailLoadWithError ...

因爲那就必須:

- (void) webViewDidFailLoadWithError:(NSError *)error { 

} 

缺少第一個參數,所以當方法被調用的委託,你不會不知道哪個網頁視圖返回的錯誤。

...或者爲什麼第一個匹配 第二個樣式?

,因爲那就必須

- (void)webView:(UIWebView *)webView DidFinishLoad { 
} 

這不是有效的方法名,因爲「DidFinishLoad」部分沒有一個參數凹口 - 是之前,你不能只是將部分添加到方法名稱中,而不將它們與參數相匹配(唯一的例外是根本不接收參數的方法)。

我希望說清楚。