#import中的#import?

时间:2011-11-30 23:21:39

标签: objective-c import

  

可能重复:
  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}}

4 个答案:

答案 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

它也会修复你的依赖循环;)