Objective-C 避免物件循環引用

Objective-C 避免物件循環引用

ALT

使用物件或開發新物件時,都會引用宣告,宣告定義在.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而避免循環引用的問題。

結語

請記住!並非所有清況都是這樣做,如果您引用的標頭檔是有其他必存被編譯器所知道的宣告、協定之類,那還是可以在標頭檔中引用標頭檔的,只是能避免的話就可以盡量避免。

參考資料

更新日誌

日期 內容
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
  • 循環引用 引用循環 类循环引用