iOSはクラスのヘッダファイルでできるだけ他のヘッダファイルを参照しないでください

1860 ワード

OCはC、C++と同様にヘッダファイル(header file)とインプリメンテーションファイル(implementation file)を用いてコードを区切る.OCでクラスを記述する標準的な方法は、クラス名でファイル名を作り、それぞれ2つのファイルを作成し、ヘッダファイル接尾辞用.h、インプリメンテーションファイル接尾辞用.mで1つのクラスを作成した後、そのコードは以下のように見える.
//WGPerson.h
#import 

@interface WGPerson : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@end

//WGPerson.m
#import "WGPerson.h"

@implementation WGPerson
//todo
@end

WGPersonにWGAddressなどの新しい属性を追加したい場合は、一般的に次のように書きます.
//WGPerson.h
#import 

@interface WGPerson : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@property (nonatomic, strong) WGAddress *address;
@end

しかし、コンパイルにWGAddressが導入されたという問題がある.hのファイルの場合、WGAddressクラスは見えないため、WGAddressを一括して導入する必要がある.だからよくある方法はWGPersonですhに次の行を加えます.
#import "WGAddress.h"

この方法は実行できるが優雅ではない.WGPersonクラスを使用するファイルをコンパイルする場合は、WGAddressクラスのすべての詳細を知る必要はありません.WGAddressというクラスがあることを知るだけでいいので、次のように宣言できます.
@class WGAddress;

この宣言方法は「前方宣言」(forward declaring)と呼ばれ、WGPersonのヘッダファイルはこのようになっています.
//WGPerson.h
#import 

@class WGAddress;

@interface WGPerson : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@property (nonatomic, strong) WGAddress *address;
@end


一方、WGPersonクラスの実装ファイルでは、WGAddressの詳細が具体的に使用されているため、WGAddressクラスのヘッダファイルを導入する必要があります.
//WGPerson.m
#import "WGPerson.h"
#import "WGAddress.h"

@implementation WGPerson
//todo
@end

ヘッダファイルを導入するタイミングをできるだけ遅らせ,必要がある場合にのみ導入することで,クラスの利用者が導入するヘッダファイルの数を減らし,コンパイルに要する時間を減らすことができる.
Effective Objective-C 2.0を読んで感銘を受けます