Obj C クラス ファイルには .h と .m の 2 つのファイルがあり、.h にはインターフェイス定義 (@interface) が保持され、.m にはその実装 (@implementation) が保持されます。
しかし、いくつかのクラスで、.h と .m の両方で @interface が発生しているのを見ましたか?
両方のファイルで @interface が必要なのは何ですか?そうする特定の理由はありますか?また、そうした場合の利点は何ですか?
Obj C クラス ファイルには .h と .m の 2 つのファイルがあり、.h にはインターフェイス定義 (@interface) が保持され、.m にはその実装 (@implementation) が保持されます。
しかし、いくつかのクラスで、.h と .m の両方で @interface が発生しているのを見ましたか?
両方のファイルで @interface が必要なのは何ですか?そうする特定の理由はありますか?また、そうした場合の利点は何ですか?
.hファイル内の@interface
は一般にパブリックインターフェイスです。これは、次のような継承を宣言するインターフェイスです。
@interface theMainInterface : NSObject
コロンと、これが継承し:
ているスーパーオブジェクトに注意してください。これは、.hファイルでのみ実行できると思います。次のようなカテゴリでを宣言することもできます@interface
NSObject
@interface
@interface theMainInterface(MyNewCatergory)
つまり、これは、次@interface
のように1つの.hファイルに複数のを含めることができることを意味します。
@interface theMainInterface : NSObject
// What ever you want to declare can go in here.
@end
@interface theMainInterface(MyNewCategory)
// Lets declare some more in here.
@end
@interface
.hファイルでこれらのタイプのsを宣言すると、通常、それらで宣言されているすべてのものが公開されます。
ただし@interface
、.mファイルでプライベートを宣言することはできます。これは、選択されたものをプライベートに拡張する@interface
か、選択されたものに新しいカテゴリを追加する@interface
か、新しいプライベートを宣言する3つのことのいずれかを実行します。@interface
これを行うには、このようなものを.mファイルに追加します。
@interface theMainInterface()
// This is used to extend theMainInterface that we set in the .h file.
// This will use the same @implemenation
@end
@implemenation theMainInterface()
// The main implementation.
@end
@interface theMainInterface(SomeOtherNewCategory)
// This adds a new category to theMainInterface we will need another @implementation for this.
@end
@implementation theMainInterface(SomeOtherNewCategory)
// This is a private category added the .m file
@end
@interface theSecondInterface()
// This is a whole new @interface that we have created, this is private
@end
@implementation theSecondInterface()
// The private implementation to theSecondInterface
@end
これらはすべて同じように機能しますが、唯一の違いは、いくつかはprivate
、いくつかはpublic
あり、いくつかは持っているということですcategories
@interface
.mファイルで継承できるかどうかはわかりません。
お役に立てれば。
.mファイルの @interface マクロは、通常、可視性を制限するためのプライベート iVar およびプロパティに使用されます。もちろん、これは完全にオプションですが、間違いなく良い習慣です。
.m ファイルに表示される @interface は通常、内部カテゴリの定義に使用されます。カテゴリ名の後に、次の形式の @interface ステートメントが続きます。
@interface ClassName (CategoryName)
@end
次の形式のようにカテゴリ名が空の場合、内部のプロパティとメソッドは非公開と見なされます。
@interface ClassName ()
@end
また、プロパティがプライベート カテゴリで readwrite として宣言され、ヘッダーで readonly として宣言されている場合があることにも注意してください。両方の宣言が readwrite である場合、コンパイラは文句を言います。
// .h file
@interface ClassName
@property (nonatomic, strong, readonly) id aProperty;
@end
// .m file
@interface ClassName()
@property (nonatomic, strong) id aProperty;
@end
プライベート メソッドを宣言する場合は、.m ファイルで @interface 宣言を使用します。