可能重复:
How can I have references between two classes in Objective-C?
Objective-C #import loop
我的代码中出现了一些错误,但我不确定,但我认为它是因为我#import
在另一个界面内#import
我正#import "OneClass.h"
@interface SecondClass : NSObject
{
OneClass * obj;
}
#import "SecondClass.h"
@interface OneClass : NSObject
{
SecondClass * obj;
}
另一个界面接口。如果我让你感到困惑,我会给你一个例子。
{{1}}
答案 0 :(得分:2)
是的,你有一个循环导入。这里的问题是编译器基本上忽略了第二次导入(重新导入第一个标题的导入),因为它认为它已经导入了那个标题。
此处的解决方案是使用@class
前向声明而不是使用#import
。这个求解器不仅是循环导入问题,而且无论如何它都是一个更好的主意,因为它打破了不必要的依赖链(例如,如果我编辑OneClass.h,则不需要重新处理SecondClass.h。)
要在此处应用此功能,只需删除SecondClass.h中的#import OneClass.h
并将其替换为@class OneClass;
在更一般的情况下,您不需要#import
头文件只是为了声明使用该头中的类的ivar / property /方法。 @class
令牌就足够了。但是,如果您从类继承,或者您正在引用该标头中声明的另一个非类类型,则需要#import
头文件。另请注意,如果您在标题中使用@class
,则需要记住将实际的#import
放入.m文件中。
答案 1 :(得分:1)
如果您要导入头文件,则需要输入完整的文件名。在这种情况下......
#import "SecondClass.h"
代替#import "SecondClass"
答案 2 :(得分:1)
您可以声明使用类而无需#import其关联的标题,如下所示:
// #import "SecondClass.h" // no need for this anymore
@class SecondClass;
@interface OneClass : NSObject
{
SecondClass * obj; // OK
}
答案 3 :(得分:1)
当没有物理依赖项时,您应该使用前向声明来最小化构建时间:
// SecondClass.h
@class OneClass;
@interface SecondClass : NSObject
{
OneClass * obj;
}
@end
// OneClass.h
@class SecondClass;
@interface OneClass : NSObject
{
SecondClass * obj;
}
@end
它也会修复你的依赖循环;)