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
三 總結編譯
向前聲明可用下降編譯時間,除非必要,則可使用向前申明,並在實現文件中映入頭文件,這樣作可用盡可能下降類之間的耦合