Objective-c 编写类 分别建立两个文件,头文件用.h,实现文件后缀用.m,代码示例以下:框架
== .h 文件 #import <Foundation/Foundation.h> @interface Dog : NSObject @property (nonatomic, strong) NSString *name; @end == .m 实现文件 @implementation Dog @end
查看Dog.h 文件,用Objective-C语言编写任何类几乎都须要引入Foundation.h,若是不引入这个文件的话,则须要引入预期超类所属框架相对应的"基本头文件"(base header file)。atom
如今建立个Person类,并引入Dog类spa
== .h 文件 #import <Foundation/Foundation.h> #import “Dog.h" //引入Dog.h @interface Person : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) Dog *dog; @end == .m文件 @implementation Person @end
当系统编译Person.h 文件的时候,Dog 并不可见,必须引入Dog.h,常见方法为.net
#import "Dog.h"
因为在编译 Person 类的文件时,不须要知道Dog类的所有细节(Dog 类中的方法),若使用 #import "Dog.h" 则必须知道Dog.h的所有细节,而Person类中只须要知道类名Dog就能够了,可用经过如下方式告诉编译器@class Dog;这种方式娇 向前声明 (forward declaring)code
修改后的Person.h 文件以下接口
== .h 文件 #import <Foundation/Foundation.h> #class Dog; //引入Dog.h @interface Person : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) Dog *dog; @end == .m 文件 #import "Dog.h" //Person 的实现文件则须要引入Dog.h文件,须要知道Dog全部接口细节。 @implementation Person @end
向前引用,就是将引入头文件的时间尽可能延后,只在确有须要时才引入,这样就可用减小类的使用者所须要引入的头文件数量。get
向前声明解决了两个类互相引用的问题。编译器
假如Dog 类中,须要添加Persion 属性,若是使用使用#import "Person.h"则会致使循环引用,当解析到Dog.h文件时,编译器会发现它引入Person.h头文件,编译器在引入Person.h头文件时,Person.h头文件反过头来引用Dog.h头文件,形成循环引用。
io
三 总结编译
向前声明可用下降编译时间,除非必要,则可使用向前申明,并在实现文件中映入头文件,这样作可用尽可能下降类之间的耦合