iphone - 我如何解决这个 Objective-C 类中双向依赖的问题?

标签 iphone objective-c cocoa cocoa-touch uikit

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

我有一个 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 的导入语句时,删除 ClassA *parentObject 实例变量并删除指定初始值设定项(采用 ClassA 引用),然后它就可以工作了。

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

欢迎提出任何建议!

最佳答案

您不需要在头文件中导入这些类。在头文件中使用 @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

关于iphone - 我如何解决这个 Objective-C 类中双向依赖的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/834955/

相关文章:

cocoa - 如果所有方法都是可选的,那么协议(protocol)的目的是什么?

javascript - 绕过WebView跨域安全

iphone - iOS 一个方法返回值的正确方式(内存管理)

iphone - 核心数据的预填充版本?

iphone - 刷新引用 ManagedObjectContext

ios - 如何限制 UITextField 中的字符

objective-c - Git - 如何查看方法/函数的更改历史记录?

iphone - 如何在iphone中实现google搜索应用

cocoa - 核心动画——片状窗口滑动

iphone - 操作简单的 Core Data 对象时崩溃