之前我们分析过 #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. Hadoop 2.4.0全然分布式平台搭建、配置、安装

    一:系统安装与配置 虚拟机软件:Virtualbox 4.3.10(已安装对应扩展包) 虚拟机:Ubuntu 13.04 LTS 32位(至于为什么选择13.04,是由于最新的版本号装上后开机会出现错 ...

  2. C# 创建移动应用

    打开VS2013 选择ASP.NET MVC4Web应用程序,点击[确定] 选择[移动应用程序]点击[确定],运行之后显示的效果如图

  3. hdu1428漫步校园( 最短路+BFS(优先队列)+记忆化搜索(DFS))

    Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校园呈方形布 ...

  4. C++11新特性,利用std::chrono精简传统获取系统时间的方法

    一.传统的获取系统时间的方法 传统的C++获取时间的方法须要分平台来定义. 相信百度代码也不少. 我自己写了下,例如以下. const std::string getCurrentSystemTime ...

  5. range-bar

    https://github.com/edmodo/range-bar

  6. Oracle DB 通过 Oracle Enterprise Manager注册要使用的恢复目录

    通过 Oracle Enterprise Manager  注册要使用的恢复目录.  a)  在 EM 中,导航到“Availability > Recovery Catalog Setting ...

  7. Android线程和线程池

    Translated From Google Android. class PhotoDecodeRunnable implements Runnable {...    /*     * Defin ...

  8. 在VS2012中GridView的一个坑

    使用GridView的时候遇到了一个坑,一个增加一个选择按钮~貌似在某些情况下会出现一个是否允许选择的属性,貌似会默认为fals,然后就返回不了指定ID!坑,巨坑!但是今天居然找不到这个属性了,难道是 ...

  9. Online ddl 思维导图

    http://blog.itpub.net/22664653/viewspace-2056953/   整理一份 MySQL DDL 的思维导图,介绍5.5版本以及之前 和 5.6 版本的 MySQL ...

  10. windows下的python扩展包下载地址

    比如lxml什么的 Unofficial Windows Binaries for Python Extension Packages pip install xxx.whl