これは、ソースファイルがでコンパイルされている順序で行うことですあなたはすでにそれが定義される前にメソッドを呼び出すことはできませんことを、おそらく認識しています(擬似コード下記参照):。
var value = someMethod();
function someMethod()
{
...
}
このsomeMethod()がまだ定義されていないため、コンパイル時エラーが発生します。同じことがクラスにも当てはまります。クラスはコンパイラによって次々にコンパイルされます。
コンパイルする前にすべてのクラスを巨大なファイルに入れると想像すれば、すでに問題を見ることができます。さんはShip
とBoatYard
クラスを見てみましょう:
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
もう一度、Ship
クラスがまだ定義されていないため、我々はまだそれを参照することはできません。この特定の問題を解決するのは簡単です。コンパイル順序を変更してコンパイルします。私はあなたがXcodeで、この画面でfamilliarだと確信している:
しかし、あなたは上下リスト内のファイルをドラッグすることができますことを知っていますか?これにより、ファイルがコンパイルされる順序が変更されます。したがって、Ship
クラスをBoatYard
クラスの上に移動すると、すべてが良好です。
しかし、そうしたくない場合や、もっと重要なことは、2つのオブジェクト間に循環関係がある場合はどうなりますか?今、私たちが問題を抱えている、
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
ああ親愛なる:さんはShip
がである現在のBoatYard
への参照を追加することによって、そのオブジェクト図の複雑さを増加させてみましょう。これらの2つを並べてコンパイルすることはできません。 Ship *クラスが実際に存在することをコンパイラーに通知する方法が必要です。このため、@class
というキーワードはとても便利です。
素人の言い方で言えば、「私を信頼してください、Ship
は本当に存在し、すぐにそれが見えます。それをすべて一緒に置くために:それはBoatYard
をコンパイルするよう
@class Ship;
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
を今コンパイラがShip
クラス定義がすぐに表示されますことを、知っています。もちろん、そうでなければ、コンパイルは成功します。
すべての@class
キーワードは、クラスがすぐに来ることをコンパイラに通知します。 は#import
の代わりではありません。あなたはまだヘッダファイルをインポートする必要があります。または、クラスの内部のいずれかにアクセスすることはできません。
@class Ship
-(void) example
{
Ship* newShip = [[Ship alloc] init];
}
これは動作しないことができる、そして船は前方宣言であるというエラーメッセージで失敗します。 #import "Ship.h"
になると、オブジェクトのインスタンスを作成することができます。
あなたのコードの一部を投稿できますか? – Devarshi
他のフレームワークのANObject部分ですか? – Devarshi
質問を編集して、ANObject.hの内容と問題の原因となるヘッダーの両方を含めるようにしてください。そして、実際のコードを表示してください。問題を含んでいない可能性のあるメークアップコードではありません。 –