まあ、当たり前の話ではあるんですけれども。

クラスが多くなって複雑になってくると、何を #import したかわからなくなってしまう時があります。クラスが少ない時は総当りでチェックすれば問題ないのですが。

なんでもかんでも #import してしまうと、循環参照が発生しやすくなります。Xcodeで循環参照が発生すると、Expected a typeのような曖昧なエラーしか表示されないため、最初は何が悪いかわからない状態になります。

そんな悲しいエラーを避けるためにも、ヘッダファイルでは、できる限り #import ではなく、 @class にすべきです。

例えば、下記はエラーになります。

/* ClassA.h */

#import "ClassB.h"

@interface ClassA : NSObject

- (void)setClassB:(ClassB *)classB;

@end

/* ------------------------------------------------------------ */

/* ClassB.h */

#import "ClassA.h"

@interface ClassB : NSObject

- (void)setClassA:(ClassA *)classA;

@end

このエラーを解消するためには、

/* ClassA.h */

@Class ClassB;

@interface ClassA : NSObject

- (void)setClassB:(ClassB *)classB;

@end

/* ------------------------------------------------------------ */

/* ClassB.h */

@Class ClassA;

@interface ClassB : NSObject

- (void)setClassA:(ClassA *)classA;

@end

のようにします。

上記の例は、クラスが2つしかないのですぐに解決できるのですが、クラスが多くなった場合、どこで循環しているか探し当てないといけません。 余計なエラーで無駄な時間を費やさないように、@Class を使うようにしましょう。