天天看点

#import与@class区别

#import 与@class区别在于:

1.#import会链入该头文件的所有信息,包括实例变量和方法;而@class只是告诉编译器,其后声明的名称是类的名称,至于这些类是如何定义的,不用考虑。

2.在头文件中,一般不需要对被引入的类的内部进行操作,只是知道类的名称就可以了,所以在头文件中一般使用@class来声明这个名称是类的名称。在实现文件里面,因为会用到这个引入类的内部的实例变量和方法,所以需要#import 来包含这个被引用类的头文件。

3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。

例如:

在ClassA.h中#import ClassB.h 相当于#include整个.h头文件。如果有很多.m文件#import ClassA.h,那么编译的时候这些文件也会#import ClassB.h增加了没必要的#import,浪费编译时间。在大型软件中,减少.h文件中的include是非常重要的。

如果只是 ClassB 那就没有include ClassB.h。仅需要在需要用到ClassB的.m文件中 #import ClassB.h

4.循依赖关系:A->B,B->A这样的依赖关系,如果使用#import来相互包含,就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误。例如:

在头文件相互#import对方的头文件,出现循环包含,报错!

使用@class就不会出现错误。

#import与@class区别
#import与@class区别

若实现文件需要使用对方的内部类方法,则在实现文件引入头文件即可:实现文件中相互引入是不会出现错误的。

#import与@class区别
#import与@class区别

总结:

头文件里面只#import超类 消息文件里面#import需要发消息过去的类 其他地方就用@class转向声明

还有另一种情况,使用有Categories的类,要在.h头文件里用#import把Categories包含进来