Objective-C基础教程学习笔记(六)源文件组织
Objective-C类的源代码由两部分组成。
一部分是的接口(interface),用来提供类的公共描述。接口包含了所有使用该类所需的信息。编译器编译@interface部分后,就能够使用该类的对象,调用类方法,将对象复合到其它类中和创建子类。
另一部分是实现(implementation)。@implementation部分告诉Objective-C编译器如何让该类工作。这部分代码实现了的接口中声明的方法。
类的代码通常放在两个文件里。一个文件存放接口部分的代码:类的@interface指令、公共struct定义、enum常量、#defines和extern全局变量等。由于Objective-C继承了C的特点,所以上述代码通常都被放在头文件中。头文件名称与类名称相同,只是用.h做后经。所有实现细节(如类的@implementation指令、全局变量的定义、私有struct等)都被放在与类同名,但是以.m为后经的文件中。
如果用.mm做文件扩展名,编译器就会认为你是用Objective-C++编写代码,这样你就可以同时使用C++语言和Objective-C来编程了。
跨文件依赖关系
依赖关系是两个实体之间的一种关系。
依赖关系可以存在于两个类之间。
依赖关系也可以存在于两个或多个文件之间。如果两个文件中的任何一个发生了变化,都需要重新编译类来继承这个变化。
导入头文件在头文件和进行导入的源文件之间建立了一种很强的依赖关系。如果这个头文件有任何变化,则所有依赖它的文件都需要被重新编译。这样会在需要编译的文件中引发一连串的变化。如果大量的.m文件都会被重新生成,即便是基于Intel的Xserve主机群集任你使用,也需要花费相当长的时间。
由于依赖关系是可传递的,即头文件也可以互相依赖,所以重新编译的问题甚至可能变得越发严重。
好在Objective-C提供了一种方法能够减少由依赖关系引起的重新编译所带来的影响。依赖关系问题的存在是因为Objective-C编译器需要某些信息才能够工作。有时,编译器需要知道类的全部信息,例如它的实例变量配置、它所继承的所有类等。而有的时候,编译器只需要知道类名即可,不需要了解它的整个定义。
Objective-C引入了关系字@class来告诉编译器:“这是一个类,所以我只需要通过指针来引用它。”
@class创建了一个前身引用。如果有循环依赖关系,@class也很有用。即A类使用B类,B类也使用A类。如果试图通过#import语句让这个类互相引用,那么最后就会出现编译错误。但是如果在A类中使用@class B,在B类中使用@class 工,那么这两个类就可以互相引用了。
如果类是继承自其它类而不是通过指针指向其它类,就不能在头文件中使用@class语句。因为编译器需要先知道所有关于超类的信息才能成功地为其子类编译@interface。它需要了解超类实例变量的配置(数据类型、大小和排序)。

浙公网安备 33010602011771号