使用OC编程的时候,若是要使用其余的类或者数据源,都须要使用#import导入对应的头文件,可是若是不理解import和@class的区别,不单单可能会形成性能低下,更可能会致使程序崩溃,下面咱们就来讲说@class
关键字和#import
的用法及区别。编程
区别性能
1. #import会包含这个类的全部信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称。spa
2. 在头文件中, 通常只须要知道被引用的类的名称就能够了。 不须要知道其内部的实体变量和方法,因此在头文件中通常使用@class来声明这个名称是类的名称。 而在实现类(.m)里面,由于会用到这个引用类的内部的实体变量和方法,在类的实现文件里须要使用#import来包含这个被引用类的头文件。.net
3.从编译效率方面考虑,若是你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面全部引用它的类都须要从新编译,若是你的类有不少的话,这将耗费大量的时间。而是用@class则不会。code
4. 若是有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,若是使用#import来相互包含,那么就会出现编译错误,若是使用@class在两个类的头文件中相互声明,则不会有编译错误出现。get
有时,使用@class申明,编译器会给出这样的告警:编译器
warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.it
这是由于在头文件(.h)中可使用@class,意思是说,暂时申明了某个类,但还不会用到类中的成员变量及实现。在实现的时候会用到成员变量及实现了,可是没有#import这个类,故没法获取该类的成员变量及实现。编译