某位同事編碼脊阴。一個(gè)類引用一個(gè)子類對(duì)象作為屬性。
#import <Foundation/Foundation.h>
#import "CycleFindTestClas.h"
@interface TestObjectClass : NSObject
@property (nonatomic, strong) CycleFindTestClas *cycle;
@end
#import "TestObjectClass.h"
// 此聲明CycleFindTestClas類的代碼會(huì)被編譯器報(bào)錯(cuò)
//(Cannot find interface declaration for 'TestObjectClass', superclass of 'CycleFindTestClas')
@interface CycleFindTestClas : TestObjectClass
@end
以下為本人猜測(cè)蚯瞧,如果紕漏請(qǐng)多多指教嘿期。
究其原因,其實(shí)很簡(jiǎn)單埋合。編譯器查找某個(gè)類無非是兩種备徐。
- 通過文件查找 #import "ClassName.h"
- 通過前置聲明 @class name;
上述代碼沒有前置聲明,那么查找TestObjectClass類必然要通過文件甚颂,于是開始了下面的流程
- 編譯器查到了TestObjectClass.h文件
- 然后開始從上到下遍歷TestObjectClass.h代碼
- 發(fā)現(xiàn)Foundation.h內(nèi)沒有蜜猾,于是查找下一行CycleFindTestClas.h
- 發(fā)現(xiàn)CycleFindTestClas.h有TestObjectClass,但是這個(gè)TestObjectClass是個(gè)父類振诬,那么繼續(xù)開始查找TestObjectClass的聲明
- 編譯器查到了TestObjectClass.h文件
- 然后開始從上到下遍歷TestObjectClass.h代碼
- ······························ 是不是循環(huán)了
所以根本就查找不到 TestObjectClass的聲明@interface TestObjectClass : NSObject蹭睡。
所以我們?cè)谌粘>幋a中 .h 內(nèi)盡量不再引用其他自定義類的 .h 文件,盡量使用前置聲明某個(gè)類.
@class CycleFindTestClas;
#import <Foundation/Foundation.h>
@interface TestObjectClass : NSObject
@property (nonatomic, strong) CycleFindTestClas *cycle;
@end