私はほぼ 1 年間 Objective C をプログラミングしてきましたが、実装 ( .m)で見つけることができるほとんど同じクラス構造を宣言する以外の目的でインターフェイス (.h)を使用する機会はありませんでした。
私は Objective C のインターフェイスのようなものを持たない他の言語から来たので、私が見逃しているいくつかまたはいくつかの使用法があるのか 、それともこの特定の言語がおそらくその前任者から継承した慣習に過ぎないのだろうか.
ありがとう!
私はほぼ 1 年間 Objective C をプログラミングしてきましたが、実装 ( .m)で見つけることができるほとんど同じクラス構造を宣言する以外の目的でインターフェイス (.h)を使用する機会はありませんでした。
私は Objective C のインターフェイスのようなものを持たない他の言語から来たので、私が見逃しているいくつかまたはいくつかの使用法があるのか 、それともこの特定の言語がおそらくその前任者から継承した慣習に過ぎないのだろうか.
ありがとう!
インターフェイスは、クラスのパブリック API です。インターフェイスで宣言されていないものは、クラスの外部からアクセスできません。C++ または Java の観点から考えると、.m ファイル (.h の @interface で宣言されていない) 内のすべてが非公開です。そのため、Objective-C で @private、@public、または @protected というキーワードが頻繁に使用されることはありません。
インターフェイスに入れるものは何でも、クラスのユーザーが操作することを意図したものであり、それ以上のものではありません。これは、最小権限の原則に従います。
@interface をクラスのドキュメントと考えることもできます。
実装 (.m) で見つけることができるほぼ同じクラス構造を宣言する以外の目的で、インターフェイス (.h) を使用する機会はありませんでした。
インターフェイスは、クラスに対して公に宣言されたインターフェイスです。実装は、そのインターフェイスを尊重する方法です。些細な例:
@interface Accumulator: NSObject
- (void)addAmount:(NSUInteger)amount;
@property (nonatomic, assign, readonly) NSUInteger currentTotal;
@end
と:
@implementation Accumulator
{
NSUInteger currentTotal; // an instance variable; we don't want to publish
// these because they're nothing to do with the
// interface we implement. Object orientation means
// not thinking about implementations beyond
// your own.
}
@synthesize currentTotal;
- (void)addAmount:(NSUInteger)amount
{
currentTotal += amount;
}
@end
したがって、一般的なガイドラインとして、@interface に入れないものは次のとおりです。
これは、インターフェイスを定義するヘッダーと実装を含むソースファイルがあるCから継承されます。それはいくつかの複式簿記を意味します。
たとえば、Javaは、この2つのファイルによるアプローチを廃止し、すべてを含む1つのファイルを用意しています。ヘッダーの理由の一部であるCのコンパイルおよびリンクフェーズはありません。
ヘッダーアプローチの1つの側面は、独自のコードを使用して、コンパイルされたバイナリファイルと一緒にヘッダーを誰かに渡すことができ、APIにリンクしてAPIを正常に呼び出すことができることです。これは、MicrosoftがWin32 APIで行うこと、またはAppleがSDKとOSで行うことです。
C++にヘッダーファイルと.cppファイルがある理由も参照してください。
すでに述べたことをさらに詳しく説明すると、C ベース言語のコンパイラは、.c/.cpp/.m ファイル内の単語について、外部ライブラリやオブジェクト ファイルにリンクする前に、ある程度の知識が必要です。その情報は、戻り値の型、関数とメソッドの引数の数と型、クラス内のインスタンス変数とメソッドなどをコンパイラに伝えます。
機能を使用するファイル内に .c/.cpp/.m ファイル全体を実際に含めると、リンカが何をすべきかわからない重複コードを持つという問題が発生します。したがって、ヘッダー ファイルには、インターフェイスについて実際に知っておく必要があることだけがリストされていますが、実装についてはリストされていません。
C と Objective-C では、実際にはさまざまな種類のインターフェイス情報を省略できますが、その結果、ヘッダーを読み取っていない関数やメソッドについて言及されている場合、(多くの場合、間違った) 仮定を作成します。たとえば、不明な関数名はそのように正しく識別されますが、コンパイラはそれが int を返すと想定します。引数がどのように処理されるかについての私の記憶は少しぼんやりしていますが、最終的にリンクされる実装された関数の引数と互換性のない引数を渡しても、おそらく文句を言うことはありません。したがって、コンパイラは多くのチェックを行うことができませんCのような静的言語が得意です。
インターフェース ファイルは、C および C++ で使用されるヘッダー ファイルに似ていますが、Objective C でのみ、プロパティやプロトコルなどの優れたものを宣言することもできます(オブジェクトのインターフェースがどのように期待されているかを確認する必要があるデリゲートなどに非常に役立ちます)。メッセージを渡します)。
オブジェクトのインターフェイス ファイルは、他のオブジェクトの実装 (.m) ファイルに含めることができるため、他のオブジェクトの実装は、インスタンス化 (作成) したばかりのオブジェクトのメソッドとプロパティにアクセスできます。