在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. python 面向对象与类的基本知识

    一  什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...

  2. foj Problem 2283 Tic-Tac-Toe

                                                                                                    Prob ...

  3. 【NOIP2016练习】T1 挖金矿(二分答案)

    题意: 思路:二分答案A 合法的答案 sigma(s[i][xi])/sigma(xi)>=a i<=m sigma(s[i][xi]-a*xi)>=0 对于每个i找到xi使s[i] ...

  4. wpf LookUpEdit PopupContentTemplate

    <dxg:LookUpEdit Name="searchLookUpEdit" HorizontalAlignment="Stretch" PopupHe ...

  5. indexOf()、includes()、startsWith()、endsWith()

    是否包含字符串三种新方法 传统上,JavaScript只有 indexOf 方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6又提供了三种新方法. includes():返回布尔值,表示是否 ...

  6. Manajro17配置

    :Manjaro近来点击率一直排行第一,比较适合笔记本使用,这次从下载刻录开始讲述: 1: 下载刻录 因为一些环境特殊原因,官网下载还是比较慢的,普通用户还是从清华镜像源下载比较快,当然你也可以选择官 ...

  7. 树(弱化版)(lca)

    3306: 树 时间限制: 10 Sec  内存限制: 256 MB 题目描述 给定一棵大小为 n 的有根点权树,支持以下操作:  • 换根  • 修改点权      • 查询子树最小值 输入 第一行 ...

  8. JVM, JRE 和JDK

    JVM -- java virtual machine A Java virtual machine (JVM) is a process virtual machine that can execu ...

  9. SSL剥离工具sslstrip

    SSL剥离工具sslstrip   在日常上网过程中,用户只是在地址栏中输入网站域名,而不添加协议类型,如HTTP和HTTPS.这时,浏览器会默认在域名之前添加http://,然后请求网站.如果网站采 ...

  10. Java ArrayList 详解

    只记录目前为止关注的.JDK1.8 一.基础属性 1.1 内部参数 //空存储实例.直接new ArrayList()便是以该空数组作为实例 private static final Object[] ...