在内部类中引用iVar的问题

时间:2012-03-30 09:43:50

标签: iphone objective-c ios cocoa-touch inner-classes

我有一个名为MyClass的类,它有一个名为MyInnerClass的小型嵌套内部类。实现文件如下所示(并且还包含嵌套内部类的ivar):

@class MyInnerClass;

@interface MyClass
{
MyInnerClass *myInnerClassIvar;
}
@property(nonatomic, retain) MyInnerClass *myInnerClassIvar;

@end

然后在实现文件中,我实现了MyClassMyInnerClass。看起来如下:

@interface MyInnerClass
{
iVar *x;
}

@property(nonatomic, retain) iVar *x;
@end

@implementation MyInnerClass
@synthesize x;
...
@end

@implementation MyClass
@synthesize myInnerClassIvar;
...
@end

我现在正在为MyClass创建一个子类,在其中我正在尝试这样调用:

self.myInnerClassIvar.x

我收到以下消息:

Property x cannot be found in in forward class object MyInnerClass *

我忘记了什么吗?之前没有实现内部类,看不出为什么这不起作用。

更新:我将MyInnerClass的界面移动到MyClass的.h,一切正常。这是一个很好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

我相信Objective-C在您尝试实现的意义上没有内部类。见SO。但关于你的问题......

在MyClass.h中没有提到MyInnerClass的iVars - 它是一个前向定义,即@class MyInnerClass因此MySubClass没有x的参考点。

如果你定义两个类MyClass& MyInnerClass(考虑到它可能是一件糟糕的事情) - 将它们放在两个单独的.h文件和两个独立的.m文件中(即正常)。在MyClass中创建一个MyInnerClass类型的@property。然后在MySubClass中你需要导入MyClass& MyInnerClass。

答案 1 :(得分:0)

我将MyInnerClass的界面移动到MyClass的.h文件中,如下所示:

MyClass.h

@class MyInnerClass;

@interface MyClass
{
MyInnerClass *myInnerClassIvar;
}
@property(nonatomic, retain) MyInnerClass *myInnerClassIvar;

@end

@interface MyInnerClass
{
iVar *x;
}

@property(nonatomic, retain) iVar *x;
@end

我会等到我作为答案检查之前等待,因为基于之前的答案,我知道有一些怀疑。我尝试这个的唯一原因是因为我在Apple示例SimpleTextInput中看到它,除了那个整个内部类在.m文件中。无论如何,有兴趣听听人们对此有什么看法,如果它可能会在以后产生不必要的副作用或者它的确定。