1.接口和实现的拆分
- 将所有代码放入main.m文件中,不适合大型项目。
- 分析:ObjC中,类的源代码分为两部分;
- 接口(interface):提供类的描述,包含了使用该类所需的信息;
- 实现(implementation):告诉编译器如何让该类工作,实现了接口中声明的方法。
存放接口代码的文件:放在头文件中,头文件名称与类名称相同,用.h 作后缀
- 类 的@interface指令
- 公共struct定义
- enum常量
- #define 和全局变量的声明(extern)等
- 全局变量定义在头文件中,将引起重定义、link error
存放实现代码的文件:放在与类同名,是以.m为后缀的文件中。
- 所有实现细节如类的@implementation的指令。
- 全局变量的定义。
- 私有struct
- 结构体定义放在@implementation 和@end之外;
- .m文件不止包含类实现。
拆分总结:
main函数、底层类、继承类、复合类的头、源文件分类总结
文件类型 | 说明 |
类Engine、Tire类 | #import<Foundation/Foundation.h> |
类Engine、Tire类 | #import”自己.h" |
继承类 头文件 | #import“基类. h” |
继承类 源文件 | #import”自己.h" |
复合头文件 | #import”组成元素.h" |
复合原文件 | #import”自己.h" |
main.m | #import”所有.h” |
2.跨文件的依赖关系
依赖关系:两个实体间的一种关系,可存在于两个类之间,也可以存在于两个或多个文件之间。
跨文件依赖关系的建立
导入头文件将在头文件和进行导入的源文件之间建立了一种很强的依赖关系
如果这个头文件有任何变化,则所有依赖于它的文件都要重新编译;
传递性
依赖关系可传递的,即头文件也可以互相依赖,因此重新编译的问题可能变的很严重。
@class关键字:
告诉编译器,这是一个类,只需要通过指针来引用它。@class 创建了一个前向引用,告诉编译器后面会知道这个类是什么。
提高效率,编译器不需要处理整个头文件
如果需要引用某个类中的方法,该指令不能胜任。
复合:
只需要被引用类的指针作为数据成员;
代码中只出现对象的指针。
继承:
需要被引用类的方法以继承,代码中出现类。
@Class 与 #import
在继承的头文件中,使用#import 导入超类的头文件
复合的头文件中,使用@class,不导入基本元素的头文件,
源文件中,使用#import导入基本元素的头文件。
原因分析:
编译器需要知道所有关于超类的信息。才能编译@interface的内容。
本章总结:
- 理解ObjC中接口,实现文件功能
- 掌握ObjC中文件拆分规则
- 理解跨文件依赖关系
- 理解关键字@class 的使用,复合,继承。