20

これらのプロトコルをこれらの方法で宣言することの違いは何ですか? .h ファイル内のファイルが公開されているだけですか?

in .h file:
@interface TestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

in .m file:
@interface TestViewController () <UISearchBarDelegate, UISearchDisplayDelegate, UIAlertViewDelegate, MKMapViewDelegate, CLLocationManagerDelegate>
4

4 に答える 4

27

プロトコルを .h ファイルに追加すると、ヘッダー ファイルをインクルードするすべての人に、クラスが特定のプロトコルに準拠していることがわかります。

プロトコルを .m ファイルに追加すると、これは基本的に、クラスがプロトコルに準拠していることを示す非公開の表示になります。実装のみが知っています。

クラスがプロトコルに準拠していることを外部のクラスが知る必要がある場合は、最初の形式 (.h ファイル内) のみを使用する必要があります。実装のみが重要な場合は、2 番目の形式 (.m ファイル内) を使用する必要があります。

あなたが示した例では、テーブルビュープロトコルに準拠しているクラスについて他のクラスが知る必要があることはほとんどありません。それらは .m ファイルにあるはずです。また、他のクラスが検索プロトコルについて知る必要はほとんどありません。これらは実装の詳細です。これらは .m ファイルに属します。

両方を使用する場合もあります。これで問題ありません。

これが私のガイドラインです。他のクラスにプロトコルの使用について知らせる必要がある場合を除き、.m ファイルに入れます。

于 2013-01-21T16:49:36.610 に答える
4

私が間違っていない限り@protocol Foo;、クラスがプロトコルを採用していることも宣言している場合、前方宣言を使用することはできません。

つまり、クラスのヘッダー ファイルに、プロトコル宣言を含む別のヘッダー ファイルをインクルード/インポートする必要があります。プロジェクトのサイズと複雑さによっては、これがヘッダー ファイルの「依存地獄」につながる可能性があります。

これが本当に危険かどうかは、実際のプロジェクトで判断する必要があります。ほとんどの場合、気にする必要はありませんが、この角度について言及したかっただけです。

于 2013-01-21T16:52:30.567 に答える
3

私はそれがスタイルの問題ではないことを認めます!!!

これらのプロトコルを.mで非表示にする理由は、クラスがいくつかのフレームワークで使用される可能性があるためです。そこに.hが表示され、誰もが「ああ、これらはこのクラスのデリゲートプロトコルです」と見ることができます。隠し魔法の代わりに。

そのため、不透明ではなく透明になります。

于 2013-01-21T16:47:07.763 に答える
1

クラスを使用する人が、クラスが何らかのプロトコルを実装しているかどうかを知ることができるように、最初の方法が望ましいと判断します。これはメリットしかありません。

プロトコルは、いくつかのメソッドが実装されていることを保証するために使用されます。これは、Objective-C では不可能な多重継承に代わるものです。あるプロトコルに準拠するオブジェクトを関数またはメソッドに渡したいとします。このクラスが何らかのプロトコルを実装していることを確認する必要があります。この場合、クラスが実装しているプロトコルを知る必要があります

また、次のような関数 (またはメソッド) に対するコンパイラの警告をシャットアウトします。

void foo(id< SomeProtocol> obj) {...}

透明性は多くの場合良いアイデアですが、不利になることはめったにありません。

于 2013-01-21T16:31:46.617 に答える