#include与#import、@class的区别

#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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266