2009-04-25 8 views
2

できるだけIDまたはNSSomeObject *を使用する方が良いでしょうか?私はコンパイラが明示的になっているかどうかをよりよく確認できることを知っていますが、どちらがより良い方法であるか不思議でした。(id)対Objective-C/Cocoaの(NSSomeObject *)?

例えば:

- (IBAction)someButton:(id)sender 

- (IBAction)someButton:(NSButton *)sender. 

それらのいずれかに何らかのメリットがありますか?

答えて

1

- (IBAction)someButton:(id)senderを使用する場合は、NSNotificationなどのイベントをセレクタとして呼び出すことができます。一方、2番目のケースでは、NSButton *だけがこのメソッドを使用できます。

複数のオブジェクトタイプがアクションを呼び出すことを許可するかどうかは、良い習慣です。私は肯定的ではありません。しかし、少ないコードを書いたりデバッグすることができるので、私はそれを使用します。

+0

宣言をNSButton *のままにしておくと、別の型のオブジェクトインスタンスを渡そうとするとコンパイラが警告しますが、Objective-Cメソッドは遅延バインドされているため、適切なセレクタ(メソッド)実行時に –

+0

実際にIBActionの引数としてselfを渡す必要はありません。これは単なる通常の引数です。ちょっと、ほとんどの場合、あなたは単に送信者としてnilを渡すことができます。 – Chuck

+1

、またはメソッドを ' - (IBAction)someButton'と宣言します。これは大抵の場合大丈夫です。 –

1

私は特定のクラスを使いたいです。

Objective-Cは動的言語であるため正しいタイプを書くよう強制しませんが、コンパイラはいくつかの明白なエラーについて警告することができます。

さらに、Objective-C 2.0のプロパティはidタイプでは機能しません。アクションは何からだけでなく、ボタンから呼び出し可能でなければなりませんので、私は、idを使用したいIBActionであなたの具体的な例では


1

私はそれが明示的だとき、コンパイラがより良い チェックを行うことができます知っているが、私は ちょうど良く 練習していると思いまして。

明示的な入力(=オブジェクトの正確なタイプの命名)はあなたの友人です。コンパイラーがより良い検査を行うことができれば、より多くのエラーが検出されます。明示的な入力によって制限されすぎることがある場合にのみ、idタイプ(= duck typing)を使用します。

+0

上記の両方の答えは、特定のオブジェクトタイプではなく、(id)を使用する理由を示しています。 –

+0

静的な型定義を使用することをお勧めします。 – zoul

+0

+1非常に合成! –

1

コンパイラが最も基本的な間違いを捉えるのに役立つように、最も明示的な型を特に使用することをお勧めします。しかし、あなたが得る安全性は、ごくわずかです。予期しないインスタンスタイプをメソッドに渡すような高次のエラーを検出するための適切な単体テストがあることが重要です。

関連する問題