多くのコードサンプルを確認したところ、一般的に、ヘッダー(.h)ファイルですべてのメソッドとグローバル変数を宣言していることがわかりました。必要ですか?
3 に答える
公的に使用されるメソッド(つまり、メソッドを実装するクラス以外のクラスによって)および(実際には)グローバル変数は、実際にヘッダーファイルで宣言する必要があります。重要なのは、ヘッダーファイルを別のソースコードファイルにインポートして、そこで宣言されている機能にアクセスできるということです。
プライベートであることが意図されているメソッド(クラスの内部実装の一部としてのみ呼び出される)は、クラス拡張で宣言できます。最近のバージョンのLLVM/Xcodeでは、@property以外のメソッドに対して実際にそれを行う必要はありません。それらを実装するだけで、コンパイラは、同じクラスの実装内の他のメソッドから呼び出されたときにそれらが存在することを確認できるほど賢くなります。
@implementation
プライベートivarを明示的に定義する必要がある場合(最近ではまれです)、またはの直後の括弧で囲まれたセクションで定義できます@interface ClassName ()
。
つまり、.hファイル内の他のクラスからアクセスできる必要があるメソッド、関数、および変数を宣言します。プライベートメソッドと変数は、.mファイルでのみ宣言してプライベートに保つ必要があります。
SDKの最近のバージョンでは、クラスの内部でのみ使用するメソッドを宣言する必要がないため、.hファイルの乱雑さを減らすことができます。一般に、.hに配置したメソッド、プロパティ、およびivarは、他のクラスがアクセスする必要があることがわかっているものだけです。そうすれば、内部専用であるはずのプロパティに外部からアクセスするという間違いを犯すことはありません。残りは、次のように.mファイルにクラス拡張子を入れます。
#import "MyClass.h"
@interface MyClass ()
{
int _myIvar; // I rarely use these anymore,
// but if you want to use them, they go here.
}
@property (strong, nonatomic) NSArray *someArray;
@property (strong, nonatomic) NSDictionary *anotherProperty
@end
@implementation MyClass
@end
ヘッダーファイルは、コンパイラにとって特別な意味はありません。とにかく#importと書くと、プリプロセッサはそれらを実装ファイルにコピーアンドペーストするだけです。