標籤:objective-c 類 前向聲明 class 編譯器
1、為什麼使用@class
與C++語言一樣,OC也需要一個標頭檔(h檔案),一個實現檔案(m檔案)。當你引用其他類的時候,你就需要引入標頭檔。雖然引用標頭檔沒有任何問題,但是如果你不想知道這個類的細節,只想知道它僅僅是個類的話,引用標頭檔可能顯得多餘,而且會增加編譯的時間。用@class的話,你可以不引入任何標頭檔,就能讓編譯器知道某個它是一個類。例如:
@class B;
@interface A:NSObject
@property B* b;
@end;
極端情況講,如果有成千上萬個類都引入同一個標頭檔,當這個標頭檔所對應的類發生變化和改動,那麼這些引入標頭檔的類都需要重新編譯,而@class 不受此影響。
@class還能解決一個重要的問題,就是依賴迴圈關係。即當兩個類相互引用的時候,不管你先引用哪一個標頭檔,都會出現另一個類未定義。比如:
//// A.h
@interface A:NSObject
@property B* b; /////先引入A.h B此時未定義 編譯出現錯誤
@end;
//// B.h
@interface B:NSObject
-(void)setFriend:(A*)a; ////先引入B.h A此時未定義 編譯出現錯誤
@end;
我們通過@class 輕鬆解決這個問題
//// A.h
@class B;
@interface A:NSObject
@property B* b; /////前向聲明B 編譯通過
@end;
//// B.h
#import "A.h"
@interface B:NSObject
-(void)setFriend:(A*)a; ////引入A.h A被聲明,編譯通過 註:A類也可以進行前向聲明
@end;
2、有時候必須引入標頭檔
當你需要繼承的時候,你必須引入標頭檔,知道其完整的定義。當你實現某個協議的時候,同樣的道理。所以我們最好把協議單獨放在一個標頭檔裡。
當然最好還是能不引入標頭檔就不引入,如果需要引入一些標頭檔的時候,也可以考慮放到分類(category)中,這樣的好處是增加編譯的效率和降低類之間的耦合。
今天要點:
除非有必要,否則不引入標頭檔。這樣做可以降低耦合,減少編譯時間。
無法前向聲明時,盡量把引入標頭檔的操作放到category中。
IOS強化知識(2)@class的運用