美文网首页
#include与#import、@class的区别

#include与#import、@class的区别

作者: 烟雨平生花飞舞 | 来源:发表于2018-05-14 16:27 被阅读0次

    #include

    区分 #include 与#include "x.h"的作用

    #include :它用于对系统自带的头文件的引用,编译器会在

    系统文件目录下去查找该文件.

    #include "x.h":

    用户自定义的文件用双引号引用,编译器首先会

    在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。

    在使用#include的时候要注意处理重复引用(这也是objc中#include与#import的区别)

    例如:ClassA 与 ClassB同时引用了ClassC,不做重复引用处理的时候在ClassD中同时引用ClassA,ClassB编译会提示对ClassC重复引用的错误.

    我们可以:#ifndef _CLASSC_H#define _CLASSC_H

    #include "ClassC"

    #endif这样处理在编译时就不会有重复引用的错误出现(在objc中

    #import解决了这个问题,这是它们的区别)#import

    #import 大部分功能和#include是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用再去自己进行重复引用处理.

    @class

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

    综上所述#include,#import与@class的区别可以做一下理解:

    #include与#import在引用一个类的时候会包含这个类的所有信息包括变量方法等,但是这样做会对编译效率造成影响.比如有100个类都#import了ClassA,那么在编译的时候这100个类都会去对ClassA处理.又比如A被B引用,B被C引用,C被D引用.....此时如果A被修改,那么后面的B,C,D.....都需要重新进行编译.还有一个用法会引起编译错误的就是在ClassA中#import ClassB 在ClassB中#import ClassA那么在编译的时候也会出现未知错误。

    所以一般来说,在 interface 中引用一个类,就用@class,它会把这个类作为一个类型来使用,而在实现这个 interface 的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要 import

    这个在@class 中声明的类。 

    1.

    #include是C中用来引用文件的关键字,而#import是obj-c中用来代替include的关键字。#import可以确保同一个文件只能被导入一次,从而避免了使用#include容易引起的重复引用问题,即classA引用了classC,classB也引用了classC,而当classD同时引用classA,classB的时候就会报重复引用的错误。

    2.

    #import""与#import<>:#import""实现从当前工作目录中找要导入的文件,如果没有再到系统类库中找,而#import<>是直接从系统类库中找要导入的文件。

    3.

    #import与@class:

    @class只是告诉编译器,后面遇到的这个名称是一个类名称,至于这个类是如何实现的暂不用考虑。引入@class主要是用来解决引用死锁--如果两个类存在循环依赖关系,即A->B,B->A,如果用#import来相互包含,就会出现编译错误:

    Expected specifier-qualifier-list before ‘A’或者Expected specifier-qualifier-list before ‘B’。

    一般情况下,在 .h文件中,只需要知道类的名字就可以了,所以用@class,而在 .m文件中通常需要知道类的成员变量即方法,所以要用#import来将类文件导进来。

    那为什么不在 .h文件中直接用#import来将类文件导入呢,因为如果导入大量的头文件,编译器就会花大量的时间来编译。

    需要在 .h文件中用#import的情况:

    1/如果有继承关系的要用#import,如,A继承B,需要在A中将B import进来。

    2/使用有category的类,需要在 .h文件中用#import将该类的category导进来。

    总结:

        1. 如果不是c/c++,尽量用#import。

        2. 能在实现文件中#import,就不在头文件中#import。

        3. 能在头文件中@class+实现文件中#import,就不在头文件中#import。

    #import和@class的区别:

    (1)包不包含

         #import会包含这个类的所有信息(包括实体变量和方法),而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,你现在不需要关心

    (2)用与不用

    在头文件中,一般只需要知道被引用的类的名称就可以了,不需要关心类内部细节,所有用@class

    在实现文件中,会用到被引用类的内部的实体变量和方法,所以用#import来包含被引用类的头文件

    (3)编译效率

        假如你有100个头文件都#import了同一个头文件A,或者这些文件存在依赖关系:A–>B, B–>C, C–>D...。当头文件A发生改变的时候,后面所有引用它的类都需要重新编译,这是非常耗性能的。而用@class则不会。

    (4)是否会产生循环依赖

    假如有循环依赖关系:A–>B,B–>A,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

     所以,一般来说,@class是放在interface中的,只是为了在interface中声明这个类。如果在@implementation中需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

    https://www.jianshu.com/p/b4b5a68015db

    http://blog.csdn.net/ios_fh/article/details/50292161

    https://www.cnblogs.com/stevenschen/archive/2014/07/04/3825044.html

    相关文章

      网友评论

          本文标题:#include与#import、@class的区别

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