4

好的,这可能是一个非常愚蠢的初学者问题,但是:

我有一个 ClassA,它将从 ClassB 创建一个子对象并将其分配给一个实例变量。详细说明:ClassA 将在指定的初始化程序中分配和初始化 ClassB,并将其分配给 childObject 实例变量。它的标题如下所示:

#import <Foundation/Foundation.h>
#import "ClassB.h"

@interface ClassA : NSObject {
    ClassB *childObject;
}

@end

然后是ClassB的头部。ClassB 必须引用 ClassA。

#import <Foundation/Foundation.h>
#import "ClassA.h"

@interface ClassB : NSObject {
    ClassA *parentObject;
}

- (id)initWithClassA:(ClassA*)newParentObject;

@end

当 ClassA 对象从 ClassB 创建一个子对象时,ClassA 对象将调用 ClassB 对象的指定初始化器,它必须在其中传递自己(self)。

我觉得有什么问题,但现在我不知道它到底是什么。我认为我知道这是行不通的。他们不能互相导入。编译器只是告诉我:“错误:'ClassA'之前的语法错误”。当我删除用于导入 ClassA 的 import 语句时,删除 ClassA *parentObject 实例变量并删除指定初始化程序(它采用 ClassA 引用),然后它就可以工作了。

现在,这是我想要实现的(如果这很重要):我需要在 UIScrollView 中进行一些非常特殊和复杂的行为。所以我决定对它进行子类化。因为主要部分将在委托方法中完成,所以我决定为我的 UIScrollView 子类创建一个“通用”委托对象。然后,我的 UIScrollView 子类会自动创建该特殊委托对象并将其分配给其委托属性。委托对象本身需要引用它的父对象,即定制的 UIScrollView,以便它可以访问该滚动视图的子视图。但无论如何,即使有更好的方法来解决这个问题,我仍然想知道如何使用两个需要彼此的“相互依赖”的对象来做到这一点。

欢迎任何建议!

4

3 回答 3

15

您不需要在头文件中导入这些类。在头文件中使用@class,然后仅在 .m 文件中使用 #import:

// ClassA.h:
@class ClassB;
@interface ClassA : NSObject
{
    ClassB *childObject;
}
@end


// ClassA.m:
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA
//..
@end


// ClassB.h
@class ClassA;
@interface ClassB : NSObject
{
    ClassA *parentObject;
}
- (id)initWithClassA:(ClassA*)newParentObject;
@end


// ClassB.m:
#import "ClassB.h"
#import "ClassA.h"
@implementation ClassB
//..
@end
于 2009-05-07T14:33:21.100 回答
5

使用@class A;and@class B;而不是#imports 来告诉编译器不要担心类定义,继续前进,因为稍后会遇到它们。

基本上,替换#import "A.h"@class A;.

于 2009-05-07T14:32:03.773 回答
5

您需要做的是“前向声明”您的类,而不是导入完整的定义。例如:

#import <Foundation/Foundation.h>

@class ClassB; // Tell the compiler that ClassB exists

@interface ClassA : NSObject {
    ClassB *childObject;
}

@end

你对 ClassB 头文件做类似的事情。

于 2009-05-07T14:34:31.740 回答