Objective-C学习--源文件结构
1. 类拆分成 接口和实现部分
接口:类的@interface指令、公共struct定义、enum常量、#define和extern全局变量等 .h
实现:@implementation指令、全局变量的定义、私有struct等 .m
2. 导入头文件有两种不同的方法:
使用引号导入:#import “Tire.h” 导入的是项目本地的头文件,可以编辑
使用尖括号导入:#import <Cocoa/Cocoa.h> 用来导入系统头文件,属于系统,只读
3. 使用跨文件依赖关系
依赖关系是两个实体之间的一种关系。在变成和开发过程中,经常会出现关于依赖关系的问题,依赖关系可以存在于两个类之间,如Slant6类因继承关系而依赖Engine类,如果Engine发生了变化,例如添加了一个新的实例变量,那么就需要重新编译Slant6来接收这个变化。
导入头文件在头文件和进行导入的源文件之间建立了一种很强的依赖关系。如果这个头文件有任何变化,则所有依赖于它的文件都需要被重新编译,这样会在需要编译的文件中印发一连串的变化。
4. @class关键字
它告诉编译器:这是一个类,所以我只需要通过指针来引用它,这样编译器就会“平静”下来,它并不需要知道关于这个类的更多信息,只要了解它是通过指针来引用的即可。
@class Engine;
@class建立了一个向前引用,就是再告诉编译器:相信我,以后你会知道这个类到底是什么,但是现在,你只需要知道这些。如果有循环依赖关系,@class也很有用,即A类使用B类,B类也是用A类,如果试图通过#import语句让这两个类互相引用,那么最后就会出现编译错误,但是如果在A.h中使用@class B,在B.h中使用@class A,那么这两个类就可以互相引用了
继承不能用@class,因为编译器需要先知道所有关于超累的信息才能呢成功地为其子类编译@interface。它需要了解超类实例变量的配置(数据类型、代销和排序)。还记得吗?在子类中添加实例变量时,他们会被附加在超类实例变量的后面。然后编译器用这条信息来判断在内存的什么位置能找到这些实例变量,从每个方法调用自身的self就隐藏指针开始寻找,为了能够准确的计算出实例变量的位置,编译器必须先了解该类的所有内容。