@classと#importの違い

2904 ワード

importはこのようなすべてのファイルをすべてインポートしますが、@classはコンパイラにクラス名を参照し、一般的に使用されるクラスがあることを伝えます。hファイル@interfaceの前;簡単に言えば、このようなメソッドや変数を使用する必要がある場合は、クラス全体のファイルを#importで含める必要があります。


@classのみが必要で、#importを使用してもエラーは報告されませんが、コンパイル中にimportのすべてのクラスをコンパイルする必要があります.特に参照するクラスが多い場合、プログラムの効率に大きく影響します.例えば、あなたはAクラスの中でimportがBクラスを持っていて、Bクラスの中でまたimportがc、dクラスを持っていて、そのプログラムはコンパイルする時にA、B、c、dクラスを全部コンパイルしなければなりませんが、@classでは多くの時間を費やすことはありません.
ループ依存関係がある場合、A->B、B->Aのような相互依存関係があり、#importを使用して相互に含まれるとコンパイルエラーが発生し、@classを使用して2つのクラスのヘッダファイルで相互に宣言するとコンパイルエラーは発生しません.
作者:yokingリンク:https://www.jianshu.com/p/ca39bc5056dd出典:著作権は作者の所有であり、いかなる形式の転載も作者に連絡して授権を得て出典を明記してください.
1.@class基本概念
役割はクラスを簡単に参照できます
@class Dogを簡単に使用します.
Dogはクラスであることをコンパイラに伝えるだけです.Dogというクラスのすべての内容は含まれていません
具体的な使用
はい.hファイルで@classを使用してクラスを参照
はい.mファイルに使用するimportにはこのクラスが含まれている.hファイル
2.@classその他の適用シーン
循環依存関係では、例えばAクラスがBクラスを参照し、BクラスもAクラスを参照する
このネストに含まれるコードコンパイルはエラーを報告します

import "B.h"


@interface A : NSObject
{
B *_b;
}
@end

import “A.h"


@interface B : NSObject
{
A *_a;
}
@end
@classを使用して2つのクラスで相互に宣言すると、コンパイルエラーは発生しません.
@class B;
@interface A : NSObject
{
B *_b;
}
@end
@class A;
@interface B : NSObject
{
A *_a;
}
@end
3.@classと#import
作用上の区別
importには、参照クラスの変数とメソッドを含む参照クラスのすべての情報(内容)が含まれます.
@classはコンパイラにこのようなクラスがあることを伝えるだけで、具体的にはこのクラスにどんな情報があるのか、全然分かりません.
効率上の違い
100以上のヘッダファイルが同じファイルをimportしている場合、またはこれらのファイルが順次importされている場合、最初のヘッダファイルが少し変更されると、後でこのファイルに参照されるすべてのクラスが再コンパイルされる必要があり、コンパイル効率が非常に低い
対照的に@class方式ではこのような問題は発生しません
作者:sockリンク:https://www.jianshu.com/p/6057b18dc0a2出典:著作権は作者の所有であり、いかなる形式の転載も作者に連絡して授権を得て出典を明記してください.
IOSベース:Objective-cにおける@classと#importの違いを深く理解する
オブジェクト向けobjective-C言語では、あるクラスが別のクラスに使用され、クラスのヘッダファイルに参照されるポインタを作成する必要がある場合、@classによってimport方式で導入することができる.
この2つの方法の違いは、
1、運用#import方式:被引用クラスのすべての情報を含み、被引用クラスの変数と方法を含む.
 @class : , , , , , ( , );

2、ヘッダファイルでは、一般的に参照されるクラスの名前を知るだけでよい.内部のエンティティ変数やメソッドを知る必要はありません.したがって、ヘッダファイルでは@classを使用してクラス名を宣言するのが一般的です.一方、実装クラスでは、この参照クラスの内部のエンティティ変数とメソッドが使用されるため、#importを使用してこの参照クラスのヘッダファイルを含める必要があります.
3、上記の2点からもコンパイル効率において、100以上のヘッダファイルが同じファイルをimportしている場合、またはこれらのファイルが順次improt(A->B,B->C,C->D...)されている場合、最初のヘッダファイルが少し変更されると、後でこのファイルに引用されたすべてのクラスが再コンパイルされる必要があることがわかりやすく、この効率も考えられますが、相対的に@class方式ではこのような問題は発生しません.
まとめ:上から分かるように,@classはinterfaceに置かれているが,interfaceでこのクラスを引用するために,このクラスを1つのタイプとして用いるだけである.参照されるクラスのエンティティ変数またはメソッドを参照する必要がある場合、実装クラスでは、#import方式を使用して参照されるクラスを導入する必要があります.簡単に言えば,@classキーワードを用いてコンパイルを通過させ,#improtキーワードを用いて実行を通過させる.

importとincludeの違い

  #include : #include , 

ただし2回#importを使用すると、エラーは発生しませんので、重複導入の問題を解決することができます.一度判断して、既に導入していれば導入しません