Object C基础学习(三)

来源:互联网 发布:淘宝海外集运怎么用 编辑:程序博客网 时间:2024/05/16 02:54

拆分接口与实现

OC类的源代码分为两部分,一部分是接口,用于展示类的构造,接口包含了使用该类所需的所有信息,只有将@interface所包含的部分编译后才能使用该接口所对应的类的对象,类的@interface指令、公共struct定义、enum常量、#defines和extern全局变量等一起存放于头文件中;另一部分是接口的实现,所有的实现内容如类的@implementation指令、全局变量的定义和私有struct等在与类同名但以.m为后缀的文件中。(这里的接口与java中的接口类不同,这里的接口主要是用于展示类的结构及各个类成员的声明)。
 

@class和#import

依赖关系是两个实体之间的一种关系,导入头文件使头文件和源文件之间建立了一种紧密的依赖关系,如果头文件有任何的变化那么所有依赖它的文件都得重新编译,这会在需要编译的文件中引发一连串的变化,并且依赖关系是传递的,头文件之间也可以互相依赖,导致依赖关系的原因是OC编译器需要某些信息才能工作,有时编译器需要知道类的全部信息,有的时候只需要知道类名即可,OC提供了一种方法减少由依赖关系引起的重新编译带来的负面影响,在对象复合中,复合通过指针指向对象,OC通过引入了关键字@class来通知编译器这个变量是个类,如果有循环依赖关系,A类中有用到B类,B类中用到A类,如果试图通过#import语句让两个类互相引用就会出现编译错误,如果在A.h文件中使用@class B,在B.h中使用@class A,两个类就可以互相引用了。
但是,在编译器需要知道引用的类的所有信息时就不可以只使用@class语句只能使用#import 语句来导入头文件,例如在用到继承时,编译器需要知道所有关于超类的信息才能成功地为其子类编译@interface部分,在子类中添加变量时它们会被添加在超类实例变量的后面,然后编译器利用这些信息计算在内存的什么位置能找到这些实例变量,每个方法通过self隐藏指针进行寻找,为了能够准确地计算出实例变量的位置,编译器必须先了解该类的所有内容;

0 0
原创粉丝点击