IOS OC 向前聲明 forward declaring

一 向前引用 forward declaring

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


三 總結編譯

向前聲明可用下降編譯時間,除非必要,則可使用向前申明,並在實現文件中映入頭文件,這樣作可用盡可能下降類之間的耦合

相關文章
相關標籤/搜索