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 “***”