当我们再看苹果自己封装的类的时候,经常会看到@class XXX,我们知道@class XXX是告诉编译器有这样一个类,但是这个类里面有什么东西我们不知道。
一般来说,我们在使用某一个类时,即当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,有两种方法:
一般来说,我们在使用某一个类时,即当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,有两种方法:
1.#import"" 2 . @class
例如:
#import"B.h"
@interface A:NSObject
{
B *b;
}
@end;
那么这两种方法有什么不一样呢?一般来说他们有以下几点不一样:
1.#import 引用的类,会获取到这个类的所有信息,包括被引用类的所有变量和方法,但是通过@class 引用被引用类时,只知道有这样一个类,告诉编译器在A.h中 B *b只是类的声明,具体要实现什么方法,等实现文件真正用到是,才会真正查看B类中的小心。
2.使用@class方式由于只需要只要被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以需要使用#import来包含被引用类的头文件;
3.通过上面两点也反映在编译效率上,假如有上百个头文件都#import 同一个文件,或者这个文件又#import 很多文件,那么编译起来会比较耗时,相对来说,@class不会出现这个问题
4.对于循环引用关系来说,A引用B,B又引用A,B类的代码
#import"A.h"
@interface B:NSObject
{
A *a;
}
@end;
这样就会出现循环引用的问题。
当使用@class 在两个类中相互声明,则不会出现编译错误。
所以,为了编译效率,如果要在A.h 中声明B的对象,可以用@class B 来应用,而在A.m中#import B.