美文网首页
#include #import @class介绍与区别

#include #import @class介绍与区别

作者: lionsom_lin | 来源:发表于2018-01-22 16:12 被阅读22次

    参考文件

    #include

    • #include是C中用来引用文件的关键字
    • #include <>: 通常是对系统库文件的引用,编译器会去系统文件目录下查找。
    • #include “xxx.h”: 通常是对自定义文件的引用,编译器首先会去用户目录下查找,然后再去安装目录查找,最后去系统文件目录查找。
    • 使用#include容易引起的重复引用问题,即classA引用了classC,classB也引用了classC,而当classD同时引用classA,classB的时候就会报重复引用的错误。

    #import

    • #include <> 、 #include “xxx.h” 与 #include <>、#include “xxx.h”相同。
    • #import的功能与#include差不多,但是可以解决头文件重复导入的问题,而#include会有重复导入头文件的问题, 所以在Objective-C中我们是经常使用#import。

    @class

    • 主要是用于声明一个类,告诉编译器它后面的名字是一个类的名字,而这个类的定义实现是暂时不用知道的,后面会告诉你.也是因为在@class仅仅只是声明一个类,所以在后面的实现文件里面是需要去#import这个类,这时候才包含了这个被引用的类的所有信息。

    #import与@class区别

    1. import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
    2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
    3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
    4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
    5.什么时候该用@class,什么时候需要用#import呢?

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

    (2)如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现. @class指令只是告诉编译器,这是个类,保留个空间来存放指针就可以了。

    (3)还有就是自定义代理的时候,如果在头文件中想声明遵循代理,遵循协议的时候应该用#import导入文件,不然的话会出错误。

    (4)使用有Category的类,要在.h头文件里用#import把Category包含进来。

    总结:

    1.能使用#import的地方就不要使用#inlclude

    2.使用#import不管你对一个文件同时包含了多少次,最终只会包含一次

    3.在头文件中如果没有用到包含类的实现方法,只需要知道它是一个类时,就应该使用@class,而不是#import。如果需要使用类的一些方法时,则需要使用#import。

    4.能使用@class的地方就不要使用#import

    相关文章

      网友评论

          本文标题:#include #import @class介绍与区别

          本文链接:https://www.haomeiwen.com/subject/ldalaxtx.html