Objective-C 避免物件循環引用
使用物件或開發新物件時,都會引用宣告,宣告定義在.h
檔案中,我們稱為標頭檔(header),Objective-C中並未規定標頭檔一定要哪個檔案中引入,視情況會在.h
或程式中.m
、.mm
,但避免重覆引用標頭檔,丹尼的做法是把標頭檔宣告在.m
、.mm
中引用,這樣的做法會使Xcode在編譯時才會實現方法,寫程式期間比較不會因為Xcode的預先編譯讓Xcode會頓頓的感覺。
範例
下面程式範例讓你在標頭檔如果需要使用同樣物件時,加上前置宣告@class 物件名稱
來告知編譯器:
/* filename:DYBox.h */ @class DYLine @interface DYBox : NSObject @property (nonatomic, copy) NSString *labelName; @property (nonatomic, copy) NSString *labelAddress; @property (nonatomic, copy) DYLine *dyline;
/* filename:DYBox.m */ #import "DYBox.h" #import "DYLine.h" @implementation DYBox : 程式內容 : @end
DYBox.h
中加入@class DYLine
前置宣告,之後在DYBox.h
中宣告DYLine
物件不需要再引入標頭檔,因為DYBox.m
內容已經引入標頭檔DYLine.h
而避免循環引用的問題。
結語
請記住!並非所有清況都是這樣做,如果您引用的標頭檔是有其他必存被編譯器所知道的宣告、協定之類,那還是可以在標頭檔中引用標頭檔的,只是能避免的話就可以盡量避免。
參考資料
- iOS 关于两个.m文件相互导入对方的.h文件问题
- #include、#import与@class的使用与头文件循环引用问题
- C 語言中的引用防護 (include guard)
- @class directive in Objective-C
- 【Objective-C】@class介绍及使用注意事项
更新日誌
日期 | 內容 |
---|---|
2017/06/03 | 內容調整、標題修改 |
2014/01/09 | 首篇 |
關鍵字
- 避免在標頭檔(.h)匯入不需要的標頭檔
- @class
- expected specifier-qualifier-list before
- warning: receiver is a forward class and corresponding @interface may not exist
- 循環引用 引用循環 类循环引用