在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. Oracle Dual 表详解

    1.DUAL表的用途Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中--查看当前连接用户SQL> select user from dua ...

  2. 转 Python执行系统命令的方法

    传送门 Python执行系统命令的方法 http://www.linux-field.com/?p=15 Python中执行系统命令常见方法有两种: 两者均需 import os (1) os.sys ...

  3. udp 多播

    先来了解下UDP UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一 ...

  4. 快充 IC BQ25896 的 常用參數

    一: POWER-PATH MANAGEMENT (有接 adapter) 1:Vbat > Vsysmin,Isys = 0A, BATFET disable Vsys = Vbat + 50 ...

  5. bq25896 IINDPM 及 無 IINDPM 時的 regsiter

      無 IINDPM status 有 IINDPM status   [bq25890 reg@][0x0]=0x5d[0x1]=0x6[0x2]=0x91[0x3]=0x1a[0x4]=0x8[0 ...

  6. hdu 1065(推公式)

    I Think I Need a Houseboat Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  7. tomcat7.0.55配置单向和双向HTTPS连接

    HTTPS配置中分为单向连接和双向连接,单向连接只需要服务器安装证书,客户端不需要,双向连接需要服务器和客户端都安装证书 下面的配置都没有用CA签名来配置,都不能用于生产环境,实际配置中是需要CA的, ...

  8. 洛谷——P2853 [USACO06DEC]牛的野餐Cow Picnic

    P2853 [USACO06DEC]牛的野餐Cow Picnic 题目描述 The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ ...

  9. git 撤回上一次commit中某一个不想添加的文件

    1. 假设我们修改了文件a,同时修改了IDE的配置文件b 2.此时我们只想添加文件a到commit中,却不小心将b也添加进去了 3.那么怎么撤回呢? 4.第一种方法 :重新提交commit 5. 第二 ...

  10. Linux Perf Probes for Oracle Tracing

    Luca Canali on 21 Jan 2016 Topic: this post is about Linux perf and uprobes for tracing and profilin ...