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中。