2

Xcode で Objective-C を使用しています。すべての関数とメソッドが .h ファイルまたはプライベート @interface メソッドで宣言されていることを確認するために、コードを証明するメカニズムはあるのでしょうか?

明確にするために、私はコーディング接線に立ち、viewController.m ファイルにメソッドを直接書き込みます。

- (Awesome*) generateAwesomeOfMagnitude:(NSFloat)magnitude { ...

そして、viewController.h ファイルに見出しを追加するのを忘れてしまいます。これがプライベート メソッドである場合、これを行ったことを通知するものは何もないため、戻って、完了時にすべてが手動で宣言されていることを確認する必要があります。自動でチェックする方法はありますか?

注:コンパイラが警告をスローするようにしようとしています。本当に私が尋ねるべきだった設定はありますか。

4

2 に答える 2

3

Omar の答えは正しいです。オブジェクトがセレクターに応答するかどうかをオブジェクトに尋ねることは、実行時にオブジェクトがメソッドに応答するかどうかを確認するためにオブジェクトをプローブするための推奨される方法です。ただし、「すべてのメソッドが宣言されていることを自動的に確認する方法は?」という質問があります。(おそらくコンパイル時)。答えは、自分で何かを書かない限り、これを自動的に行うことはできないということです。

これは、Objective-C を「動的」にする理由の一部です。どこでもメソッドを宣言する必要はありません。これにより、次のようなことが可能になります。

id anUnknownObject = [[NSClassFromString(whoKnowsWhatIllBe) alloc] init];
[anUnknownObject performSelector:@selector(whoKnowsWhatIllDo)];

これは、たとえば、Web サービスから文字列をフェッチし、その文字列のみに基づいてクラスをインスタンス化できることを意味します (もちろん、インスタンス化するためにクラスは実行時に存在する必要がありますが、コンパイラには手がかりがありません)。 )。

これは、このようにプログラミングする必要があるという意味ではありませんが、可能であることを意味し、ほとんどのものと同様に、適切なユースケースがあり、言語の大きな違いです. 極端なデカップリング、ポリモーフィズム、および非常に楽しいパターンを促進します。

一般に、プライベート メソッドを .m クラス拡張で宣言することはベスト プラクティスと見なされていますが、これの価値はコンパイラではなく、プログラマのためのものです。何人か (Objective-C への主要な貢献者を含めて、当分の間パブリック フォーラムで無名になる予定) は、すべてのメソッドの名前を 1 つのファイルに 2 回入力する必要がないことも示唆しています (少ないコード、間違いが少なくなります - 他の人のクラスを初めて見ている場合は、もう少しスクロールが必要です)。整頓されたパブリック API を持つことは、まさにヘッダーの目的です。クリーンな実装を持つことは重要ですが、m に入ると、いずれにせよ私有地にいるという前提があります。スクロールします。メソッド名が何であるかを確認してください。

于 2012-06-30T17:42:46.080 に答える
0

クラスの使用時に実行時にメソッドが存在するかどうかを確認するには

if([yourObject respondsToSelector:@selector(generateAwesomeOfMagnitude:)])
    //has this method
else
    //does not have this method

ただし、.m でメソッドを定義し、それを .h ファイルに含めない場合、警告は表示されません。

ただし、.h ファイルで宣言されていないメソッドに別のクラスがアクセスしている場合は、警告が表示されます。

于 2012-06-30T16:27:45.520 に答える