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
- 循环引用 引用循环 类循环引用