Objective-C 【关于导入类(@class 和 #import的区别)】

之前我们分析过 #include 和 #import 的区别,#import不会引起交叉编译,#import 确定一个文件只能被导入一次,使在递归包含中不会出现问题。

那么 #import 和 @class 又有什么区别呢?


(1)从实质上来说。


@class 和 #import 都是引入类的信息。

而不同的是 #import 会包含引入类的所有信息,包括实体变量和方法。

而 @class 一般是在头文件中使用的,因为他只告诉编译器,声明的类的名称,只是将这个类作为一个类型来用的(比如 Dog类的头文件中引入了 @class Animal; ,那么我们只是可以创建一个Animal类型的实例变量,如: Animal *ani;   )。至于引入类(Animal)中是如何定义的(定义了哪些实例变量和方法),是不知道的。所以在头文件中如果用 @class 声明某个类后,在.m的实现中如果用到类的具体方法或实例变量时还得再 #import类 一下。

(2)从编译时间上来说。(是编译时的时间,并非运行时的时间)

在.h头文件中进行声明时用 #import 的话,如果有许多类都 #import 同一个类,或者这些文件是依次引用同一个类的话,当引用的那个类的头文件有变化后进行编译时,后面所有引用它的类都需要重新编译,那么这将耗费大量的时间。

而用 @class 则不会耗费太多时间,用@class只是简单的告诉编译器有这个类,将这个类作为一个类型来用,让编译顺利通过就好了。如果在.m文件中还需要用引入类的实例变量和方法的的话,再 #import 一下类就好了。编译器编译的时候是只编译头文件的,所以在.m中用 #import 与编译时间没太大关系。从而会节约编译的时间。

(3)几个情况说明。

  ①一般如果有继承关系的用 #import。

  ② 另外就是如果有循环依赖关系,如:A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错

  ③还有就是自定义代理的时候,如果在头文件中想声明代理的话,如
@interface SecondViewController:UIViewController<XXXDelegate>时 应该应用#import,不然的话会出错误,注意XXXXDelegate是自定义的

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-08-27 18:00  王中尧  阅读(182)  评论(0编辑  收藏  举报