当前位置:  开发笔记 > IOS > 正文

如何在Objective-C类中使用双向依赖项解决此问题?

如何解决《如何在Objective-C类中使用双向依赖项解决此问题?》经验,为你挑选了3个好方法。

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

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

#import 
#import "ClassB.h"

@interface ClassA : NSObject {
    ClassB *childObject;
}

@end

然后,有ClassB的标题.ClassB必须引用ClassA.

#import 
#import "ClassA.h"

@interface ClassB : NSObject {
    ClassA *parentObject;
}

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

@end

当ClassA对象从ClassB创建子对象时,ClassA对象将调用ClassB对象的指定初始化程序,它必须传递给自己(self).

我觉得有些不对劲,但是现在我还没有得到它的确切含义.有人认为我知道这不起作用.他们不能互相进口.编译器告诉我:"错误:'ClassA'之前的语法错误".当我删除导入语句以导入ClassA时,删除ClassA*parentObject实例变量并删除指定初始值设定项(需要ClassA引用),然后它可以工作.

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

欢迎任何建议!



1> e.James..:

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



2> freespace..:

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

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



3> Martin Cote..:

您需要做的是"转发声明"您的类而不是导入完整定义.例如:

#import 

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

@interface ClassA : NSObject {
    ClassB *childObject;
}

@end

你为ClassB头文件做了类似的事情.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有