2011-01-25 5 views
2

Objective Cには2つの標準的な方法を書いているようですが、違いが何であり、どれが他のものよりもむしろ使われているのかどうか分かりません。例えば、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

すべてが引数の数になります。ほとんどすべてのデリゲートメソッドは、最初の引数としてメソッドの送信者を渡します。メソッドがそれ以上の引数を必要としない場合、メソッドのシグネチャは最初のスタイルになります。そうでなければ、2番目のスタイルになります。

残念ながら、最後の引数の後にメソッドシグネチャに追加のテキストを追加することはできません。もしそうなら、私はAppleがむしろメソッド- (void) webView:(UIWebView *)webView didFinishLoadの名前を付けると確信しています。

編集:興味深い議論は、この構文の決定の歴史上のスタックオーバーフローの上に、ここ最近ありました:。でもブラッド・コックス、Objective-Cのの作成者は、中に相づちを打っWhy must the last part of an Objective-C method name take an argument (when there is more than one part)?

1

複数のWebビューまたはテーブルビューを同時に画面に表示することができます。リストされたメソッドのコールバック中に、Webビューまたはテーブルビューのタグプロパティを調べて、そのようなコールバックを担当するWebビューまたはテーブルビューを決定することができます。

1

それはAppleの独自の一部ですデリゲートメソッドについてはObjective-Cのコーディングガイドライン: http://akos.ma/gt

デリゲートメソッド(または委任法)は、特定のイベントが発生したとき(デリゲートがそれらを実装している場合)、オブジェクトはそのデリゲートで呼び出すものです。

    がメッセージを送信するのオブジェクトのクラスを識別することによって名前を開始
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row; 
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename; 

それらはオブジェクトのデータソースに呼び出されたメソッドにも同様に適用独特の形状を有しますしたがって、あなたの質問に答えるために、引用するメソッドはすべて同じパターンに従います。メソッドの最初の(たまには唯一の)パラメータは、デリゲートメソッドを呼び出すオブジェクトです。

1

2つ目は単にwebViewDidFailLoadWithErrorと書かれていません...

それがなければならないであろうので:最初の引数を欠い

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

} 

、その方法は、デリゲートに呼び出されたときに、エラーが返されたのWebView知ることはできません。

...または最初の一致がない理由 2番目のスタイルは?

それは「DidFinishLoad」の部分はあなたがいないだけででき、ある--that引数が先行していないため、有効なメソッド名ではありません

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

でなければならないので、メソッド名に引数をマッチせずに部分を追加します(引数をまったく受け取らないメソッドの唯一の例外を除いて)。

私はそれが明確になることを望みます。

関連する問題