Objective-C 【关于导入类(@class 和 #import的区别)】
之前我们分析过 #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的区别)】的更多相关文章
- 动态导入(import)和静态导入(import)的区别
import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....Cl ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- 2017.12.19 Java包的静态导入import static和import的区别
import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com-..ClassName;而静态导入是这样:import static com-..ClassN ...
- 【Python】导入类
导入单个类 随着不断添加类,可能会使文件变得很长,那么此时,需要将类存储在模块中,然后在主程序导入类即可 book.py class Book(): '''模拟一本书''' def __init__( ...
- Python中导入类
python导入类与导入函数,模块基本一样,一个模块fun,其中包含三个类 class Dog(): def __init__(self,name): self.name=name def bark( ...
- python 类 --导入类
导入类 1.1.导入单个类 如何导入单个类 以上一节为例,编写一个car.py程序 编写一个新程序my_car.py 希望在my.car.py文件中直接使用car.py中的函数,使用from car ...
- maven项目引用时,导入类报错,选择两个项目同时执行Maven update
maven项目引用时,导入类报错,选择两个项目同时执行Maven update springboot引入第三方jar,需要扫描时加@ComponentScan("第三方的包名") ...
- 使用 sqoop 将mysql数据导入到hdfs(import)
Sqoop 将mysql 数据导入到hdfs(import) 1.创建mysql表 CREATE TABLE `sqoop_test` ( `id` ) DEFAULT NULL, `name` va ...
- # 导入模块 from wxpy import * # 初始化机器人,扫码登陆 bot = Bot()
# 导入模块 from wxpy import * # 初始化机器人,扫码登陆 bot = Bot()
随机推荐
- 使用GLSL实现更多数量的局部光照 【转】
原文 http://www.cnblogs.com/CGDeveloper/archive/2008/07/02/1233816.html 众所周知,OpenGL固定管线只提供了最多8盏灯光.如何使得 ...
- 一个不错的JavaScript解析浏览器路径方法(转)
JavaScript中有时需要用到当前的请求路径等涉及到url的情况,正常情况下我们可以使用location对象来获取我们需要的信息,本文从另外一个途径来解决这个问题,而且更加巧妙 方法如下: fun ...
- [Angular 2] Import custom module
The application structure: in app.module.ts: import { NgModule} from "@angular/core"; impo ...
- UVA 1401 - Remember the Word(Trie+DP)
UVA 1401 - Remember the Word [题目链接] 题意:给定一些单词.和一个长串.问这个长串拆分成已有单词,能拆分成几种方式 思路:Trie,先把单词建成Trie.然后进行dp. ...
- IDispatch接口 - GetIDsOfNames和Invoke(转)
IDispatch接口是COM自动化的核心.其实,IDispatch这个接口本身也很简单,只有4个方法: IDispatch : public IUnknown { public: virtual H ...
- 在Linux里读取UBOOT环境变量
转载:http://falloutmx.blog.163.com/blog/static/39236020201211145010154/ 可以通过mtd方式读取,也可以用ioremap方式.不过这些 ...
- start.s中的.balignl 16,0xdeadbeef
转载:http://blog.csdn.net/l_thread/article/details/6020036 开始看start.s中的代码,又一句.balignl 16,0xdeadbeef,不知 ...
- Windows下用Eclipse搭建C/C++开发环境
本文假定你已经熟悉Java,Eclipse的安装,并能顺利启动和运行Eclipse.此外因为各软件版本在不断更新,有些地方可能不准确,以最新的.原文资料为准. 距上一次写和调C++程序,已经5.6年了 ...
- QTextEdit 总结
关于Qt的富文本处理, 可以参考文档:Rich Text Processing 该文档有人翻译了一下(本来我想翻译- -!), 参考Rich Text Processing富文本处理 QTextEdi ...
- qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新
qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新 Widget wit ...