解析:ios
不少刚开始学习iOS开发的同窗可能在看别人的代码的时候会发现有部分#import操做写在 .m 文件中,而 .h 文件仅仅使用@class进行声明,不由纳闷起来,为何不直接把#import放到h文件中呢?学习
这是由于 .h 文件在修改后,全部 #import 该 .h 文件的全部文件必须重 新Build,所以,若是把 #import 写在 .h 文件中,#impor t该 .h 文件的文件也就会产生没必要要的编译,增长编译时间,特别是在项目文件多的状况 下。想象一下,若是只是修改一个 .h 文件而致使上百个文件没必要要的编译,那是一件多么让人纠结的事情。。。对于@class只是告诉编译器有这个class,请不要报错或警告,所以不会给编译形成影响。ui
下面来讲一下#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与编译时间没太大关系get
接下来讲说何时该用@class,何时该用#import进行声明编译器
1.通常若是有继承关系的用#import,如B是A的子类那么在B中声明A时用#importio
2. 另外就是若是有循环依赖关系,如:A->B,B->A这样相互依赖时,若是在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错编译
3.还有就是自定义代理的时候,若是在头文件中想声明代理的话如@interface SecondViewController:UIViewController时应用#import否则的话会出错误,注意XXXXDelegate是自定义的
在分析 #Imclude 和 #include的用法