在Objective-c中,当一个类需要引用另一个类,即建立复合关系的时候,需要在类的头文件中建立被引用类的指针。 如:Car.h#import @interface Car:NSObject
{Tire *tires[4];Engine *engine;
}…
实现类我们先省略,如果你直接这么编译,编译器会报错,告诉你它不知道Tire和Engine是什么。这时候有两个选择,一个是import这两个被引用类的头文件,另一个是使用@class声明Tire和Engine是类名。 二者的区别在于:import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

转载于:https://www.cnblogs.com/changningios/p/4005921.html

objective-c @class 类名和#improt 类名.h的区别相关推荐

  1. 【转】C++中#include包含头文件带 .h 和不带 .h 的区别

    C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些 ...

  2. C\C++中头文件string与string.h的区别

    http://www.cnblogs.com/Cmpl/archive/2012/01/01/2309710.html 在C++中,#include<iostream>与#include& ...

  3. 头文件stdio与stdlib.h的区别

    头文件#include<stdio.h>与#include<stdlib.h>的区别 stdlib 头文件即standard library标准库头文件 stdlib 头文件里 ...

  4. 磁感应强度B与磁场强度H的区别,联系与物理意义

    磁感应强度 B 与磁场强度 H 的区别,联系与物理意义 从前学普物的时候,提到了磁感应强度 B 与磁场强度 H 这两个概念.因为一直疏于思考, 没有仔细想过两者的异同.教材里说, H 是人为引入的定义 ...

  5. 头文件cstring、string、string.h的区别

    头文件cstring.string.string.h的区别 <string>是C++标准库头文件,使用stirng类型必须首先包含string头文件,用于字符串操作,string类型可以进 ...

  6. 头文件string与string.h的区别

    #include<iostream>与#include<iostream.h>的区别 在C++中,#include<iostream>与#include<io ...

  7. java classname.this_java 中 类名.this与类名.class

    1.this指的是当前正在访问这段代码的对象,当在内部类中使用this指的就是内部类的对象, 为了访问外层类对象,就可以使用外层类名.this来访问. 一般也只在这种情况下使用这种 示例代码,请注意第 ...

  8. Java12-day03【​​​​​​​(类名、抽象类名、接口名)作为形参和返回值、内部类、常用API(Math、System、toString()、Arrays)、冒泡】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  9. java类名变量_java类名操作变量方法

    JAVA中包括成员变量的定义和方法的定义,而成员变量的定义又包括类变量和实例变量的定义:其中用static 修饰的是类变量,而其他是实例变量. 实例变量和类变量的区别:一个类通过使用new 运算符可以 ...

最新文章

  1. 互联网技术的技术名词
  2. spring中控制器和服务层校验的实现原理
  3. 用Nginx如何配置运行无扩展名PHP文件或非.PHP扩展名文件
  4. frameset在html5下用什么代替_速速围观!冬至吃货地图来啦~蚌埠的吃货们,你们今天吃什么?...
  5. HTML day02
  6. 数据源管理 | Kafka集群环境搭建,消息存储机制详解
  7. RabbitMq分布式事务解决方案第二篇
  8. powershell自动化操作AD域、Exchange邮箱系列(9)—导出AD内所有计算机到数据库
  9. 《iOS9开发快速入门》——第2章,第2.1节Xcode 7.0的新特性
  10. [转载] PyTorch简介
  11. Apache认证(目录)
  12. (PC+WAP)绿色小学学校网站源码 pbootcms中小学教育培训机构网站模板
  13. 完全删除conime.exe
  14. 【Pyqt5】实现小学三年级口算题生成器
  15. 会议一体机_多媒体会议系统方案
  16. java深克隆 浅克隆_通过Java中深克隆与浅克隆来理解克隆
  17. 一个不会说话的汤姆猫游戏源码
  18. java性能调优指南,就是这么简单
  19. uniapp手机号一键登录
  20. 中国无花果市场供需形势与未来产值预测报告(新版)2022-2027年

热门文章

  1. Prism for WPF初探(构建简单的模块化开发框架)
  2. Ajax的数据发送与接收(jQuery)
  3. JustifyTextView 解决TextView中英文混排自动换行的问题
  4. O(n)线性构造后缀树详解(一)
  5. decimal(C# 参考)
  6. tomcat 部署:直接访问域名访问项目
  7. LiteRouter 路由
  8. orcal 忘记用户名和密码
  9. 第十六周程序阅读(8)
  10. JavaScript语言基础7