Omar の答えは正しいです。オブジェクトがセレクターに応答するかどうかをオブジェクトに尋ねることは、実行時にオブジェクトがメソッドに応答するかどうかを確認するためにオブジェクトをプローブするための推奨される方法です。ただし、「すべてのメソッドが宣言されていることを自動的に確認する方法は?」という質問があります。(おそらくコンパイル時)。答えは、自分で何かを書かない限り、これを自動的に行うことはできないということです。
これは、Objective-C を「動的」にする理由の一部です。どこでもメソッドを宣言する必要はありません。これにより、次のようなことが可能になります。
id anUnknownObject = [[NSClassFromString(whoKnowsWhatIllBe) alloc] init];
[anUnknownObject performSelector:@selector(whoKnowsWhatIllDo)];
これは、たとえば、Web サービスから文字列をフェッチし、その文字列のみに基づいてクラスをインスタンス化できることを意味します (もちろん、インスタンス化するためにクラスは実行時に存在する必要がありますが、コンパイラには手がかりがありません)。 )。
これは、このようにプログラミングする必要があるという意味ではありませんが、可能であることを意味し、ほとんどのものと同様に、適切なユースケースがあり、言語の大きな違いです. 極端なデカップリング、ポリモーフィズム、および非常に楽しいパターンを促進します。
一般に、プライベート メソッドを .m クラス拡張で宣言することはベスト プラクティスと見なされていますが、これの価値はコンパイラではなく、プログラマのためのものです。何人か (Objective-C への主要な貢献者を含めて、当分の間パブリック フォーラムで無名になる予定) は、すべてのメソッドの名前を 1 つのファイルに 2 回入力する必要がないことも示唆しています (少ないコード、間違いが少なくなります - 他の人のクラスを初めて見ている場合は、もう少しスクロールが必要です)。整頓されたパブリック API を持つことは、まさにヘッダーの目的です。クリーンな実装を持つことは重要ですが、m に入ると、いずれにせよ私有地にいるという前提があります。スクロールします。メソッド名が何であるかを確認してください。