解析:

       很多刚开始学习iOS开发的同学可能在看别人的代码的时候会发现有部分#import操作写在 .m 文件中,而 .h 文件仅仅使用@class进行声明,不禁纳闷起来,为什么不直接把#import放到h文件中呢?

      这是因为 .h 文件在修改后,所有 #import 该 .h 文件的所有文件必须重 新Build,因此,如果把 #import 写在 .h 文件中,#impor t该 .h 文件的文件也就会产生不必要的编译,增加编译时间,特别是在项目文件多的情况 下。想象一下,如果只是修改一个 .h 文件而导致上百个文件不必要的编译,那是一件多么让人纠结的事情。。。对于@class只是告诉编译器有这个class,请不要报错或警告,因此不会给编译造成影响。

下面来说一下#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与编译时间没太大关系

接下来说说什么时候该用@class,什么时候该用#import进行声明

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

2. 另外就是如果有循环依赖关系,如:A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错

3.还有就是自定义代理的时候,如果在头文件中想声明代理的话如@interface SecondViewController:UIViewController时应用#import不然的话会出错误,注意XXXXDelegate是自定义的

在分析 #Imclude 和 #include的用法

#include
        区分 #include <x.h>与#include "x.h"的作用
        #include <x.h>:它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.
         #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在引用一个类的时候会包含这个类的所有信息包括变量方法等,但是这样做会对编译效率造成影响.比如有99个类都#import了ClassA,那么在编译的时候这99个类都会去对ClassA处理.又比如A被B引用,B被C引用,C被D引用.....此时如果A被修改,那么后面的B,C,D.....都需要重新进行编译.还有一个用法会引起编译错误的就是在ClassA中#import ClassB 在ClassB中#import ClassA那么在编译的时候也会出现未知错误。
        所以一般来说,在interface中引用一个类,就用@class,它会把这个类作为一个类型来使用,而在实现这个interface的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要import这个在@class中声明的类。

转载于:https://www.cnblogs.com/Sucri/p/5262215.html

@class #import辨析 #include相关推荐

  1. 微信小程序import和include

    import 和include 是微信小程序提供的2中引用方式 import 一般结合模板template使用 import import可以在该文件中使用目标文件定义的template,如: 在 i ...

  2. freemarker include 和 import

    lib/my_test.ftl 模板内容如下: <#macto copyright date><p>Copyright (C)${date}Julia Smith.All ri ...

  3. 微信小程序开发之——import、require和include

    一 概述 require:js代码中引用其他js模块代码 include:wxml文件中引用template模板文件 import:既可以在js代码中导入模块代码,又可以在wxml或wxss文件中导入 ...

  4. 微信小程序模块化开发 include与模板开发 template

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 1. include  是引用整个wxml文件,我通常会配合js,css一起使用: 使用场景,需要封装 ...

  5. Java中import及package的用法

    有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不  太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import  的程式通通写 ...

  6. import 别名_python中的import、from import以及import as的区别

    首先介绍一下import和include的区别或者说import相对include的好处: import导入的内容只会被包含一次,在引入之前会检测是否已经存在该模块,不存在才会被引入,而include ...

  7. java import class_@class vs. #import

    我的询问是这样的 . 什么时候使用#import,什么时候使用@class? 简单回答:当存在物理依赖时,你 #import 或 #include . 否则,您使用前向声明( @class MONCl ...

  8. iOS之路9-#import 与#include和 @class的区别

    2019独角兽企业重金招聘Python工程师标准>>> #import 与#include和 @class 的区别? @class 一般用于头文件中需要声明该类的某个实例变量的时候用 ...

  9. Django从理论到实战(part13)--include函数

    学习笔记,仅供参考 参考自:Django打造大型企业官网: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的写 ...

最新文章

  1. mybaits十五:使用trim自定义字符串的截取规则
  2. Web性能优化之图片优化
  3. 微软公司服务器主题软件,微软重大IT升级 七款产品巩固软件帝国
  4. linux基础知识——exec函数
  5. java entrypoint_java – 有时只调用AuthenticationEntryPoint
  6. 对 5G “迟钝”的苹果,该如何后来居上?| 极客头条
  7. 中国“两高”发布司法解释 依法严惩涉地下钱庄犯罪
  8. 对CSRF(跨站请求伪造)的理解
  9. ACM ICMR 2021雷达目标检测挑战赛(ROD2021)
  10. java 环境win7_java 环境变量 win7
  11. 使用Excel进行线性规划
  12. 【办公自动化】Excel“一键”生成国土“三调”转换代码
  13. python双向链表以及双向循环链表
  14. 根据c语言代码自动画出流程图,根据程序画出流程图
  15. 6s的充电电流怎么测试软件,用数字万用表测量手机充电器的充电电流的方法和问题...
  16. smplayer 字幕!解决smplayer字幕乱码的方法
  17. JACTF misc wp
  18. Leetcode之跳跃游戏整理
  19. 手机端linux虚拟机,教你如何用「UTM虚拟机」让苹果手机运行Windows/安卓/Linux系统...
  20. 非J2EE部署解决方案

热门文章

  1. Zabbix 3.0 配置企业微信报警(注册---测试)
  2. python一些方便excel行操作的函数(一)
  3. https证书pfx 生成 pem,crt,key
  4. 「BZOJ2654」tree
  5. bzoj2733永无乡
  6. SKYLINE UVALive - 4108
  7. ASP.NET Core 网站发布到Linux服务器
  8. 四级菜单实现(Python)
  9. C风格字符串与C++风格字符串
  10. 帕斯卡命名法 pascal命名法