在Objective-C中,能够使用#import和@class来引用别的类型, 可是你知道两者有什么差别吗?

@class叫做forward-class,  你常常会在头文件的定义中看到通过@class的引用, 原因就是当你仅仅用@class来引入一个类时, 编译器知道有这么一个类,也就是说它能识别Engine *engine;



而在implementation文件里,假设你想要訪问engine.price, 编译器就会出错, 即使你用了@class引入了. 这时须要使用的事实上是#import 来引入Engine.h这个头文件,它包含这个类的全部的定义, 它

知道你有定义一个price, 而通过@class引入的除了类本身之外,没有详细的信息.

#import<> 跟 #import""又什么差别?“”的意思是自己创建的文件,用这个首先会在当前的文件夹中寻找,假设找不到就到其它的位置寻找,“”和<>是相对的一个是自己创建的文件一个是系统的文件

更具体的分析:

  



在Objective-c中,当一个类须要引用还有一个类的接口时,须要在类的头文件里建立被引用类的指针

Person.h

@interface Person: NSObject

{

   Woman *woman;

   Man *man;

}

.......

假设直接编译,会出错,由于不知道Woman,Man是什么。

这时有两个选择,一是import这两个被引用类的头文件,还有一个是使用@class申明Woman和Man是类名,二者的差别:





1. import会包括这个类的全部信息。包括实体变量和方法。而@class仅仅是告诉编译器。其后面声明的名称是类的名称。至于这些类是怎样定义的。临时不用考虑,后面会再告诉你;

2. 在头文件里,一般仅仅须要知道被引用的类的名称就能够了,不须要知道其内部的实体变量和方法。所以在头文件里一般使用@class来声明这个名称是类的名称,而在类的实现部分。由于会用到这个引用类的内部的实体变量和方法,所以须要使用#import来包括这个被引用类的头文件。

   

3. 在编译效率方面考虑,假设你有100个头文件都#import了同一个头文件。或者这些文件是依次被引用的。如A–>B, B–>C, C–>D这种引用关系。当最開始的那个头文件有变化的话,后

   面全部引用它的类都须要又一次编译,假设你的类有非常多的话,这将耗费大量的时间。而是用@class则不会。

   

4. 假设有循环依赖关系,如:A–>B, B–>A这种相互依赖关系,假设使用#import来相互包括。那么就会出现编译错误。假设使用@class在两个类的头文件里相互声明。则不会有编译错误出现。

所以,一般来说。@class是放在interface中的,仅仅是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,假设须要引用这个类的实体变量或者方法之类的(存在继承关系或者代理)。还是须要import在@class中声明的类进来.

objective-c中#import和@class的差别的更多相关文章

  1. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  2. jsp中@import导入外部样式表与link链入外部样式表的区别

    昨天碰到同事问了一个问题,@impor导入外部样式与link链入外部样式的优先级是怎样的,为什么实验的结果是按照样式表导入后的位置来决定优先级.今天就这个问题具体总结如下:   先解释一下网页添加cs ...

  3. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

  4. 当在ECLIPSE中import现存项目时,如遇到版本不符

    当在ECLIPSE中import现存项目时,如遇到版本不符,可选Run-->Run Configurations,进入'Run Configurations'界面,选左边的Android App ...

  5. python中import和from...import...的区别

    python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...

  6. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  7. 解决Eclipse Pydev中import时报错:Unresolved import

    在安装 图像处理工具包 mahotas 后,在eclipse中尝试import mahotas时,出现Unresolved import错误,按快捷无法自动生成代码提示 但是,程序运行时可以通过,在命 ...

  8. (原)python中import caffe提示no module named google.protobuf.internal

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5993405.html 之前在一台台式机上在python中使用import caffe时,没有出错.但是 ...

  9. pycharm 中 import requests 报错

    一 , 使用Pycharm来抓取网页的时候,要导入requests模块,但是在pycharm中 import requests 报错. 原因: python中还没有安装requests库 解决办法: ...

随机推荐

  1. vim的复制粘贴(包括系统剪贴板)

    1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只 ...

  2. mysql数据库编码格式

    1.查看数据库编码格式 mysql> show variables like 'character_set_database'; 2.查看数据表的编码格式 mysql> show crea ...

  3. jq 全选、反选、判断选中的条数

    1.全选或全不选.当勾选全选按钮#selectAll旁边的复选框#all时,列表中的选项全部选中,反之取消勾选则列表中的选项全部为未选中状态. $("#all").click(fu ...

  4. VUE之命令行报错:Expected indentation of 4 spaces but found 6

    使用vue时候,经常被一大片警告惊呆了,这是webpack默认的语法检查插件ESLint在做警告, [ESLint是一个语法规则和代码风格的检查工具,可以用来保证写出语法正确.风格统一的代码] 但是我 ...

  5. L1-3. 情人节【求第2个、第14个人的名字,设置计数器并标记一下即可】

    L1-3. 情人节 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家. ...

  6. 2014 ACM/ICPC 亚洲区 北京站

    题目链接  2014北京区域赛 Problem A Problem B 直接DFS+剪枝 剪枝条件:当前剩余的方块数量cnt < 2 * max{a[i]} - 1,则停止往下搜. 因为这样搜下 ...

  7. TensorFlow——tensorflow指定CPU与GPU运算

    1.指定GPU运算 如果安装的是GPU版本,在运行的过程中TensorFlow能够自动检测.如果检测到GPU,TensorFlow会尽可能的利用找到的第一个GPU来执行操作. 如果机器上有超过一个可用 ...

  8. IDEA连接linux服务器

    idea连接linux(完成了xshell和xftp连接linux的功能,可以直接卸载这俩了..) File->settings->Deployment左侧加号添加 选择传输类型ftp或者 ...

  9. SQLite数据库中rowid使用

    SQLite数据库中rowid使用   SQLite中每个表都默认包含一个隐藏列rowid,使用WITHOUT ROWID定义的表除外.通常情况下,rowid可以唯一的标记表中的每个记录.表中插入的第 ...

  10. free如何知道释放内存长度:vs与glibc分配内存时编译器内部处理

    鉴于网上这个资料实在太少,将以前整理过却未完全的一篇文章贴出来,希望大牛指正vs下内存管理方式.可联系gaoshiqiang1987@163.com vs分配内存 vs没有源码,编译器在分配内存时,分 ...