2 在類的標頭檔案中盡量少引入其它的標頭檔案

2021-09-01 06:17:30 字數 2777 閱讀 1634

與c、c++一樣,objective-c也使用「標頭檔案」和「實現檔案」來區隔**。用objective-c語言編寫類的標準方式:以類名做檔名,分別建立2個檔案,標頭檔案字尾.h,實現檔案.m

用objective-c語言編寫任何類幾乎都需要引入foundation.h,如果不在該類本身引入這個檔案的話,那麼就要引入與其超類所屬框架相對應的"基本標頭檔案"

使用向前宣告延後引入標頭檔案時機

比如存在cwgperson類和cwgemployer類。

每個cwgperson例項都應該有乙個cwgemployer.

於是我們一般會這樣寫:(直接在.h中引入標頭檔案)

#import "cwgemployer.h" 

@inte***nce cwgperson : nsobject

@property (nonatomic, strong) cwgemployer *employer;

@end

這樣做不是不行,只是不夠優雅罷了.因為在編譯乙個使用了cwgperson類的檔案時,不需要知道cwgemployer類的全部細節,只需要知道有乙個類名cwgemployer就可以了.於是我們還可以這樣寫:

//類cwgperson標頭檔案

@class cwgemployer

@inte***nce cwgperson : nsobject

@property (nonatomic, strong) cwgemployer *employer;

@end

cwgperson.m實現檔案中則需要引入cwgemployer類的標頭檔案,因為使用的時候,則必須知道其所有的細節.

//類cwgperson實現檔案

#import "cwgperson.h"

#import "cwgemployer.h"

@implementation cwgperson

// implementation of methods

@end

將引入標頭檔案的時機盡量延後, 只在確有需要時才真正引入,這樣可以減少類的使用者所需引入標頭檔案的數量.假如把cwgemployer.h引入到cwgperson.h中,那麼只要引入cwgperson.h,就會引入cwgemployer.h的全部內容.如此持續下去,則要引入很多根本用不到的內容,還增加了編譯時間.

例如cwgemployer.m中增加了方法:

如果cwgperson和cwgemployer,都將彼此標頭檔案引入到自己標頭檔案中,這時候編譯cwgemployer,編譯器必須知道cwgperson這個類,而要編譯cwgperson,又必須知道cwgemployer.這時候就會導致"迴圈引用".雖然使用#import不會導致死迴圈(#include會,可以巨集定義規避),但是這意味著2個類有乙個是無法編譯成功的。

分析:當類a引用類b,類b又需要引用類a的時候,如果我們都在.h標頭檔案中引用對方的標頭檔案,那麼就會出現標頭檔案迴圈引用的問題,實際上使用#import而非#include指令雖然不會導致死迴圈,但卻意味著兩個類中有乙個無法被正確編譯而報錯。

相互引入標頭檔案導致編譯報錯

解決方案:(目的是實現兩個檔案編譯時刻不在相互引用對方)

1.在其中乙個類.h標頭檔案使用@class關鍵字向前宣告另乙個類,在該類.m檔案中再使用#import引入標頭檔案,另乙個類正常引用就行。

2.在兩個類的.h標頭檔案中均使用@class,在兩個類的.m實現檔案中再使用#import引入對應的標頭檔案。

一些必須引入標頭檔案的情況

有些時候必須引入標頭檔案:

1.該類繼承了某個超類,則必須引入定義那個超類的標頭檔案。

2.該類遵循某協議,也要引入該協議對應的標頭檔案

如果你寫的類繼承某個超類,則必須引入定義那個超類的標頭檔案.

如果要宣告你寫的那個類遵從某個協議(protocol),那麼該協議必須有完整的定義.且不能使用"向前宣告".因為"向前宣告"只能告訴編譯器有這麼個協議,但是編譯器這時要知道這個協議中定義的方法.例如:

#import "cwgshape.h"

#import "cwgdrawable.h"

@inte***ce cwgrectangle : cwgshape @property (nonatomic, assign) cgfloat width; ///< 寬

@property (nonatomic, assign) cgfloat height; ///< 高

@end

其中#import "cwgdrawable.h"是難免的.

#####總結:

* 除非確有必要,否則不要引入標頭檔案.一般說來,應該在某個類的標頭檔案中使用"向前宣告"來提及別的類.並在實現檔案中引入那些類的標頭檔案,這樣做可以盡量降低類之間的耦合性.

* 有時無法使用"向前宣告",比如某個類要遵從某個協議,這種情況下,盡量把"該類遵循某協議"的宣告移至到"延展"中(class - continuation 分類).如果還不行,就把協議單獨放在乙個標頭檔案中,然後將其引入.

注意,繼承的標頭檔案的宣告貌似是省不了了,但是協議、屬性、例項變數必須引入標頭檔案可以放入類擴充套件中,避免迴圈引入,以及提高封裝的標頭檔案私密性,避免暴露不必要的標頭檔案,同時加快編譯速度。

標頭檔案的包含以及命名空間的引入盡量寫在cpp裡

原文 1,標頭檔案盡量包含在cpp檔案裡,而不是h檔案裡 2,不要在標頭檔案中使用using namespace 經常在標頭檔案中使用namespace。但這樣的結果就是,這個標頭檔案會被其他的檔案所包含,那麼這樣那個檔案也用了namespace所指定的命名空間,這並不是我們所期望的,可能導致衝突。...

iOS開發在類的標頭檔案中要盡可能少的引入其他標頭檔案

引入標頭檔案時,有兩種方法 一 import test.h 這種方法可行,但不夠優雅,太過冗雜。二 class test.h 這就是向前宣告 forward declaring 三 當你在乙個類中需要另乙個類時,要就要建立被引用類的指標 標頭檔案 但何時需要卻尚不知,例如 test.h import...

關於在標頭檔案中定義函式的缺點

同乙個函式 變數可以在不同的c檔案中根據需要有多個宣告,但只能有乙個定義。這就決定了如果在標頭檔案中定義函式或變數,則該標頭檔案只能使用一次,不能被別的c檔案使用,也即限制了最好只有乙個c檔案,因為別的c檔案已經不能再使用這些標頭檔案 而標頭檔案的真正用處是實現 介面 使變數或函式供別的模組呼叫函式...