跨文件依赖关系
1.拆分接口和实现
在oc中,类的定义中,很自然的被拆分成接口和实现两个部分,所以类的代码可以分别放在两个文件夹里;一个文件(头文件,.h结尾)存放接口部分代码:类的@interface指令,公共struct定义,enum常量,#defines和extern全局变量等。另一个文件(以.m结尾)存放所有的实现内容。
2.拆分 Car 程序
Tire.h文件内容
#import <Cocoa/Cocoa.h>
@interface Tire:NSObject
@end//Tire
Tire.m文件内容
#import "Tire.h"
@implementation Tire
-(NSString *) description
{
return (@"I'm a tire,I last a while");
}
@end //Tire
同理对 Engine 类的拆分:
//Engine.h 文件
#import <Cocoa/Cocoa.h>
@interface Engine:NSObject
@end //Engine
//--------------分割线----------
//Engine.m 文件
#import "Engine.h"
@implementation Engine
-(NSString *) description
{
return (@"I'm an engine . Vroom!");
}//description
@end//Engine
3.使用跨文件依赖关系
简单来说就是,如果头文件中有任何变化,那么所有依赖它的文件都要重新编译。
4.重新编译须知
导致依赖关系的问题原因是,OC编译去需要知道某些信息才能够工作。有时需要知道类的全部信息,有时只需要知道类名。
OC 引入一个关键字@class 来告诉编译器只会通过指针来引用该类,不必知道该类的全部信息。
#import <Cocoa/Cocoa.h>
@interface Car:NSObject
-(void) setEngine:(Engine *)newEngine;
-(Engine *)engine;
-(void) setTire:(Tire *)tire atIndex:(int) index;
-(Tire *)tireAtIndex:(int) index;
-(void) print;
@end//Car
当我们使用该头文件的时候,编译会报错,因为编译器无法知道Tire和Engine 到底是什么东西。
有两种方式解决:
一:
使用#import 语句导入 Tire.h 和 Engine.h
二:
Car类的接口,只是通过指针引用了Tire 和 Engine 所以可以使用@class
#import <Cocoa/Cocoa.h>
@class Tire
@class Engine
@interface Car:NSObject
-(void) setEngine:(Engine *) newEngine;
-(Engine *) engine;
-(void) setTire:(Tire *) tire atIndex:(int) index;
-(Tire *) tireAtIndex:(int) index;
-(void) print;
@end//Car
但是,当我们有一个类继承自我们自己创建的另一个类的时候,就不能用@class ,因为编译器需要知道超类的所有信息,才能成功的为子类编译@interface部分,这时,只能使用#import 语句导入超类的头文件