Unknown type name `xxxxxxx\

Unknown type name `xxxxxxx`

使用Objective-C也有好一陣子,突然在Build時發生明明該名稱在Class裡面,Build時卻說它不認識這個名稱:

原來我也掉進一般人也會發生的問題,那就是循環引用,這名詞雖然在學Objective-C並不陌生,也理解問題在哪,但發生時卻有可能沒有意識到這問題,這次紀錄一下現象,避免下次再度發生。

循環引用

顧名思意就是Class A、Class B中都有互相使用Class,意指Class A中有使用到Class B,所以會在Class A中import Class B.h,相對的Class B也是,這樣會造成所謂的循環引用,在記憶體管理中可能會造成無法它一些變數、Class釋放(Release)產生記憶體洩漏(memory leak)問題,Build時編譯器會發出警告。

如何解決

以下為循環引用例子:

//-----------start-----------
#import "Cat.h"

@interface Dog : NSObject

@property (nonatomic, strong) Cat *cat;

@end
//------------end------------

//-----------start-----------
#import "Dog.h"

@interface Cat : NSObject

@property (nonatomic, strong)Dog *dog;

@end
//------------end------------

這問題要解決它就是告知編譯器使用的Class已經有引用,讓編譯器編譯無需理會這問題,所以在循環引用的Class中加上引用Class的註記@Class Name,所以正確的為:

//-----------start-----------
@Class Cat

@interface Dog : NSObject

@property (nonatomic, strong) Cat *cat;

@end
//------------end------------

//-----------start-----------
@Class Dog

@interface Cat : NSObject

@property (nonatomic, strong)Dog *dog;

@end
//------------end------------

參考資料

Objective – C基础: 第五天 – 6.循环引用

【解决】循环导入导致:Unknown type name “***”