objective-c中#import和@class的差别
在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的差别的更多相关文章
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- jsp中@import导入外部样式表与link链入外部样式表的区别
昨天碰到同事问了一个问题,@impor导入外部样式与link链入外部样式的优先级是怎样的,为什么实验的结果是按照样式表导入后的位置来决定优先级.今天就这个问题具体总结如下: 先解释一下网页添加cs ...
- objective C中的字符串NSStirng常用操作
objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...
- 当在ECLIPSE中import现存项目时,如遇到版本不符
当在ECLIPSE中import现存项目时,如遇到版本不符,可选Run-->Run Configurations,进入'Run Configurations'界面,选左边的Android App ...
- python中import和from...import...的区别
python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 解决Eclipse Pydev中import时报错:Unresolved import
在安装 图像处理工具包 mahotas 后,在eclipse中尝试import mahotas时,出现Unresolved import错误,按快捷无法自动生成代码提示 但是,程序运行时可以通过,在命 ...
- (原)python中import caffe提示no module named google.protobuf.internal
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5993405.html 之前在一台台式机上在python中使用import caffe时,没有出错.但是 ...
- pycharm 中 import requests 报错
一 , 使用Pycharm来抓取网页的时候,要导入requests模块,但是在pycharm中 import requests 报错. 原因: python中还没有安装requests库 解决办法: ...
随机推荐
- 爬虫【自动登陆github和抽屉】
自动登陆github用户详情页 代码 #! /usr/bin/env python # -*- coding: utf- -*- # __author__ = "wuxiaoyu" ...
- 【NOIP2015】信息传递(强连通分量)
题意:找一张图中的最小环 O(n) 思路:强连通分量tarjan即可 注意环中节点数>1 ..]of longint; n,i,ans,tot,id,top,time,x:longint; pr ...
- Pόlya定理-学习笔记
gi为一个为一个置换 c(g),为c(g)的轮换的数量 (循环的数量) 太监了
- hdu 4939 2014 Multi-University Training Contest 7 1005
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- 快速掌握RabbitMQ(五)——搭建高可用的RabbitMQ集群
RabbitMQ的集群是依赖erlang集群的,而erlang集群是通过.erlang.cookie文件进行通信认证的,所以我们使用RabbitMQ集群时只需要配置一下.erlang.cookie文件 ...
- HDU 1011 Starship Troopers (树dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 题意: 题目大意是有n个房间组成一棵树,你有m个士兵,从1号房间开始让士兵向相邻的房间出发,每个 ...
- Codeforces Gym 100431B Binary Search 搜索+组合数学+高精度
原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...
- Codeforces Gym 100203G Good elements 暴力乱搞
原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 考虑暴力的复杂度是O(n^3),所以 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十一:IT人用才之道-穿透
在以道德為基礎的企業主管之人,其最根本的能力除了須要有洞悉事物的敏捷思維之外,眼光還必要有像水柱般一樣的穿山引石之能,如此不僅能夠為企業找到適才之人,更能為企業的永續經營奠定有如泰山般的基石.只可惜大 ...
- pycharm的todo和fixme标记,标志为今后再做和bug点
使用方法,及查看方法: https://blog.csdn.net/xiemanR/article/details/73368440