首页 > 代码库 > IOS强化知识(2)@class的运用

IOS强化知识(2)@class的运用

1、为什么使用@class


   与C++语言一样,OC也需要一个头文件(h文件),一个实现文件(m文件)。当你引用其他类的时候,你就需要引入头文件。虽然引用头文件没有任何问题,但是如果你不想知道这个类的细节,只想知道它仅仅是个类的话,引用头文件可能显得多余,而且会增加编译的时间。用@class的话,你可以不引入任何头文件,就能让编译器知道某个它是一个类。例如:

      @class B;

      @interface A:NSObject

      @property B* b;

      @end;

      

      极端情况讲,如果有成千上万个类都引入同一个头文件,当这个头文件所对应的类发生变化和改动,那么这些引入头文件的类都需要重新编译,而@class 不受此影响。


     @class还能解决一个重要的问题,就是依赖循环关系。即当两个类相互引用的时候,不管你先引用哪一个头文件,都会出现另一个类未定义。比如:

     

       ////  A.h

      @interface A:NSObject

      @property B* b;            /////先引入A.h    B此时未定义 编译出现错误

      @end;

      

       ////  B.h

      @interface B:NSObject

      -(void)setFriend:(A*)a;        ////先引入B.h     A此时未定义 编译出现错误

      @end;

     我们通过@class 轻松解决这个问题

     

       ////  A.h

      @class B;

      @interface A:NSObject

      @property B* b;            /////前向声明B    编译通过

      @end;

      

       ////  B.h

       #import "A.h"

      @interface B:NSObject

      -(void)setFriend:(A*)a;        ////引入A.h  A被声明,编译通过    注:A类也可以进行前向声明

      @end;



2、有时候必须引入头文件

    

       当你需要继承的时候,你必须引入头文件,知道其完整的定义。当你实现某个协议的时候,同样的道理。所以我们最好把协议单独放在一个头文件里。


       当然最好还是能不引入头文件就不引入,如果需要引入一些头文件的时候,也可以考虑放到分类(category)中,这样的好处是增加编译的效率和降低类之间的耦合。



今天要点:

除非有必要,否则不引入头文件。这样做可以降低耦合,减少编译时间。

无法前向声明时,尽量把引入头文件的操作放到category中。

IOS强化知识(2)@class的运用