OC基础回顾 (五)源文件组织

来源:互联网 发布:nginx conf没有server 编辑:程序博客网 时间:2024/04/30 10:18
  • 拆分接口和实现
    类的@interface指令、公共struct定义、enum常亮、#define和extern全局变量等代码通常放在头文件.h文件中。
    所有的实现内容,例如@implementation指令、全局变量的定义、私有struct等代码都放在.m文件中。
    如果用.mm做文件扩展名,编译器就会认为你使用Objective-C++编写的代码,这样就可以同时使用C++和Objective-C来编程了。

  • 导入头文件
    导入头文件有两种方法:使用引号或者尖括号。
    带尖括号的语句用于引用系统头文件,是只读的。
    而带引号的语句说明导入的是项目本地的头文件,是可编辑的。

  • 使用跨文件依赖关系
    依赖关系(dependency)是两个实体之间的一种关系。
    依赖关系存在于两个或多个文件之间。
    导入头文件使头文件和源文件之间建立了一种紧密的依赖关系。如果头文件有任何变化,那么所有依赖它的文件都得重新编译。
    依赖关系是传递的,头文件之间也可以相互依赖。
    文件导入过于混乱会使依赖关系混乱,从而导致重新编译花费很长时间。所以巧妙的使用@class指令,可以减少必须导入的头文件的数量,从而缩短编译时间。

  • @class
    Objective-C引入了@class关键字,用来告诉编译器:“这是一个类,所以我只会通过指针来引用它”,这样编译器就不必知道关于这个类的更多信息,只要了解它是通过指针来引用的即可。
    例如:

#import <Cocoa/Cocoa.h>@interface Car : NSObject-(void)setEngine:(Engine *)newEngine;-(Engine *)engine;-(void)setTire:(Tire *)newTire andIndex:(int)index;-(Tire *)tireAtIndex:(int)index;@end //Car

如果我们现在想使用Car.h头文件,会得到错误消息,例如error: expected a type “Tire”,编译器是说“我无法理解这个”。我们有两种方法来解决,第一种是在头文件中#import语句导入Tire.h和Engine.h,这样编译器会获取这两个类的许多信息。
此外,还有一个更好的方法。因为在Car.h文件中,它只是通过指针引用了Tire类和Engine类,所以我们可以用@class来实现。

#import <Cocoa/Cocoa.h>@classTire.h"@classEngine.h"@interface Car : NSObject-(void)setEngine:(Engine *)newEngine;-(Engine *)engine;-(void)setTire:(Tire *)newTire andIndex:(int)index;-(Tire *)tireAtIndex:(int)index;@end //Car

这样就足以告知编译器处理Car类的@interface部分所需要的全部信息了。

@class创建了一个前向引用。这是在告诉编译器,只能使用被声明的符号,而不能涉及类的任何细节。
如果有循环依赖关系,@class也很管用。即A类使用了B类,B类也使用了A类,如果试图通过#import语句让这两个类相互引用,那么就会出现编译错误。但是如果在A.h文件中使用@classB,在 B.h文件中使用@class A,那么这两个类就可以相互引用了。

0 0
原创粉丝点击