@Class

1967 ワード

//======================================================================

1.1つのクラスを引用する2つの方法
@class:メンバー変数、属性のみを定義する場合
#import:クラスを継承する場合
2.両方法の違い
#import方式は、参照されるクラスの変数とメソッドを含む参照されるクラスのすべての情報を含む.
Plainコード
#import   
   
//#import"Book.h"類似@interface Book : NSObject   
@end   
   
@interface Student : NSObject   
{   
    Book *_book;   
}   
@property Book*book;   
@end   
@class方式はコンパイラにA.hファイルの中で、B*bはただクラスの声明を教えて、具体的にこのクラスはどんな情報があって、ここで知る必要はありません.実装ファイルに本当に必要なときに、Bクラスの情報を本当に表示します.
3.正しい使い方
Student.hファイル:
Plainコード
//importはFoundationフレームワークにどのようなメンバーがいるか,方法,重複定義を避けるためである.   
#import   
//宣言時にクラスだと告げる
@class Book;   
@interface Student : NSObject   
{   
    Book *_book;   
}   
@property Book*book;   
@end   
Student.mファイル:
//使うときは、どんなメンバーや方法があるか教えています
Plainコード
#import "Book.h"   
@implement Student   
{   
    … …   
}   
@end  
4.@class方式
@class方式では被引用クラス(Bクラス)の名前を知るだけでよいが、実装クラスでは被引用クラスの実体変数やメソッドが用いられるため、.mファイルには#importを使用して参照クラスのヘッダファイルを含める必要があります.
また、100個以上のヘッダファイルが同じファイルであるか、またはこれらのファイルが順次importされている場合、最初にヘッダファイルが変更されると、後でこのファイルに引用されるすべてのクラスが再コンパイルされる必要があり、このような効率も考えられますが、相対的に@class方式ではこのような問題は発生しません.
ループ依存関係が発生すると、#importはエラーを報告します.
A.hファイル
Plainコード
#import "B.h"   
@interface A : NSObject   
{   
    B *b;   
}   
@end   
B.hファイル
Plainコード
#import"A.h"   
@interface B : NSObject   
{   
    A *a;   
}   
@end