iOS中的#import和class区别

转自http://www.cnblogs.com/chen111/archive/2012/09/05/2672659.html

下面来说一下#import同class之间的区别

在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明,你们可能也见到在.h文件进用@class来声明的,那么#import和@class进行声明 到底有什么的区别呢?下面我来说说

1.import会包含这个类的所有信息,包括实体变量和方法,而@class只告诉编 译器,声明的类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你,所以在头文件中如果用@class声明某个类后,在.m的实现中如果用到声明类的具体方法或变量时还得再#import类  

2.在.h头文件中进行声明时用#import的话,如果100个头文件都#import同一个头件,或者这些文件是依次引用的,如A->B,B->C,C->D,当最开始的那个头文件有变化后进行编译时,后面所有引用它的类都需要重新编译,如果引用最开始的头文件的类很多的话,那么这将耗费大量的时间,而用@class则不会,可能有人会想即然.h只是用@class只是简单的一个声明告编译器有这个类不让其报错,那么.m中要用到引入的类的方法和属性时,不还是要#import头文件一次,是的这个是对的,但编译器编译的时候只编译头文件的,所以你的.m中用#import与编译时间没太大关系

3.接下来说说什么时候该用@class,什么时候该用#import进行声明,

  (1)一般如果有继承关系的用#import,如B是A的子类那么在B中声明A时用#import

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

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

PS:编译的时候头文件和实现文件都会编译,不要被xcode里面选项中的编译文件列表误导了。
class 相当于C/C++的前向声明,只是提醒编译器,存在这个符号,链接的时候要去其他地方找找。只要你不要在编译器知道它的完整定义时,去使用它里面的成员或方法,就不会出错。所以.m文件里面,还是会先import相应的.h。
使用前向声明,一是如你所说,减少头文件依赖,节省编译时间;二是可以利用它来隐藏类的成员和不公开的方法。第二个好处,C++中用的比较多(如Qt中的大量的Q***Private类),Obj-c中有分类(Category),不太需要这样的方式。

 

原文地址:https://www.cnblogs.com/6yuets2/p/2679912.html