之前我们分析过 #include 和 #import 的区别,#import不会引起交叉编译,#import 确定一个文件只能被导入一次,使在递归包含中不会出现问题。

那么 #import 和 @class 又有什么区别呢?

(1)从实质上来说。

@class 和 #import 都是引入类的信息。



而不同的是 #import 会包含引入类的所有信息,包括实体变量和方法。



而 @class 一般是在头文件中使用的,因为他只告诉编译器,声明的类的名称,只是将这个类作为一个类型来用的(比如 Dog类的头文件中引入了 @class Animal; ,那么我们只是可以创建一个Animal类型的实例变量,如: Animal *ani;   )。至于引入类(Animal)中是如何定义的(定义了哪些实例变量和方法),是不知道的。所以在头文件中如果用 @class 声明某个类后,在.m的实现中如果用到类的具体方法或实例变量时还得再 #import类 一下。



(2)从编译时间上来说。(是编译时的时间,并非运行时的时间)



在.h头文件中进行声明时用 #import 的话,如果有许多类都 #import 同一个类,或者这些文件是依次引用同一个类的话,当引用的那个类的头文件有变化后进行编译时,后面所有引用它的类都需要重新编译,那么这将耗费大量的时间。



而用 @class 则不会耗费太多时间,用@class只是简单的告诉编译器有这个类,将这个类作为一个类型来用,让编译顺利通过就好了。如果在.m文件中还需要用引入类的实例变量和方法的的话,再 #import 一下类就好了。编译器编译的时候是只编译头文件的,所以在.m中用 #import 与编译时间没太大关系。从而会节约编译的时间。



(3)几个情况说明。



  ①一般如果有继承关系的用 #import。



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



  ③还有就是自定义代理的时候,如果在头文件中想声明代理的话,如

@interface SecondViewController:UIViewController<XXXDelegate>时 应该应用#import,不然的话会出错误,注意XXXXDelegate是自定义的

版权声明:本文为博主原创文章,未经博主允许不得转载。

Objective-C 【关于导入类(@class 和 #import的区别)】的更多相关文章

  1. 动态导入(import)和静态导入(import)的区别

    import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....Cl ...

  2. 【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

  3. 2017.12.19 Java包的静态导入import static和import的区别

    import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com-..ClassName;而静态导入是这样:import static com-..ClassN ...

  4. 【Python】导入类

    导入单个类 随着不断添加类,可能会使文件变得很长,那么此时,需要将类存储在模块中,然后在主程序导入类即可 book.py class Book(): '''模拟一本书''' def __init__( ...

  5. Python中导入类

    python导入类与导入函数,模块基本一样,一个模块fun,其中包含三个类 class Dog(): def __init__(self,name): self.name=name def bark( ...

  6. python 类 --导入类

    导入类 1.1.导入单个类 如何导入单个类 以上一节为例,编写一个car.py程序 编写一个新程序my_car.py 希望在my.car.py文件中直接使用car.py中的函数,使用from car ...

  7. maven项目引用时,导入类报错,选择两个项目同时执行Maven update

    maven项目引用时,导入类报错,选择两个项目同时执行Maven update springboot引入第三方jar,需要扫描时加@ComponentScan("第三方的包名") ...

  8. 使用 sqoop 将mysql数据导入到hdfs(import)

    Sqoop 将mysql 数据导入到hdfs(import) 1.创建mysql表 CREATE TABLE `sqoop_test` ( `id` ) DEFAULT NULL, `name` va ...

  9. # 导入模块 from wxpy import * # 初始化机器人,扫码登陆 bot = Bot()

    # 导入模块 from wxpy import * # 初始化机器人,扫码登陆 bot = Bot()

随机推荐

  1. maven使用.01.Hello World

    要说Java世界有什么东西是我最为留恋的:在写其他语言程序的时候,我最为想要的东西,那非maven莫属. 什么是Maven? Maven能做什么? Maven是一个针对Java的自动构建工具.所谓自动 ...

  2. Navicat for mysql 11.0破解方法

    Navicat for mysql破解器 首先下载破解器,然后解压至随意一个目录下.最后双击exe程序,按照提示找到你安装好的navicat for mysql文件夹下的navicat.exe程序,之 ...

  3. 【M15】了解异常处理(exception handling)的成本

    1.为了在运行期处理异常,程序必须做大量额外的工作.比如,即使抛出异常,也必须保证离开作用域的栈上对象执行析构方法.因此,必须记录try语句的进入点和离开点,记录catch语句能够处理的异常等.这就意 ...

  4. cdoj 1255 斓少摘苹果 贪心

    斓少摘苹果 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1255 Descr ...

  5. Delphi调用Dll的的2种写法

         unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, F ...

  6. 【智能家居篇】wifi在智能家居中的应用

    转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 在设计智能家居系统方案时,一个很关键的point就是组网方式.组网方式关系到整个智能家居系统的稳定性.可扩展性.实时 ...

  7. ValueBar

    https://github.com/PhilJay/ValueBar

  8. Web App 讲义教程

    http://www.csdn.net/tag/web%E5%BA%94%E7%94%A8

  9. 让你的PHP程序真正的实现多线程(PHP多线程类)(转)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  10. 首发Zend Studio 10.6正式版注册破解(2014-02-06更新)

    1.写在前头以下文章没有图片说明,如果你没有耐性看或想看图文并茂的图片文章请绕道,谢谢配合.转发请标明转自http://www.geekso.com/ZendStudio100/以下方法仅供技术交流学 ...