2012-03-30 11 views
2

MyInnerClassと呼ばれるネストされた小さな内部クラスを持つMyClassというクラスがあります。実装ファイルには、次のようになります(とも、ネストされた内部クラスのIVARが含まれています):内部クラスの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 * 

何か忘れていますか?前に内部クラスを実装していないので、これがうまくいかない理由はありません。

UPDATED:MyInnerClassのインターフェイスをMyClassの.hに移動し、すべてが機能します。これは良い解決策ですか?

+1

ブラケット表記( '[myInnerClassIvar x]')でアクセスしようとしましたか?また、定義されたタイプと合成されたタイプは異なります( 'iVar x'と' iVar * x') – Alexander

+0

ブラケットを使ってアクセスすると、まだ警告が表示されますが、 "xは非推奨"です。それはちょうど本当に変だ。合成された型が違うのは、これをタイプすると私が間違っていただけです(私はそれを修正しました)。 –

+0

廃止予定の警告は本当に奇妙です。 – Alexander

答えて

0

私は、次のようなMyClassのの.hファイルにMyInnerClassのインタフェースを移動:に基づいているので、私は答えとしてこれをオフにチェックする前に、私は待っています

MyClass.h

@class MyInnerClass; 

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

@end 

@interface MyInnerClass 
{ 
iVar *x; 
} 

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

前の答え、いくつかの懐疑的なことが分かっています。私がこれを試した唯一の理由は、アップルの例SimpleTextInputで見たのですが、内部クラス全体が.mファイルにある点を除いて、私はこれを見ました。とにかく、後で望ましくない副作用が起きるかどうか、あるいはOKであれば、人々がこれについて何を言わなければならないかを聞くことに興味があります。

2

Objective-Cには実装しようとしている意味での内部クラスはありません。 SOを参照してください。しかしあなたの質問について...

のMyClass.h MyInnerClassのiVarsについては言及していません。これはフォワード定義です。つまり、@class MyInnerClassです。したがって、MySubClassにはxの参照ポイントがありません。

MyClass & MyInnerClassという2つのクラスを定義している場合、2つの別々の.hファイルと2つの別々の.mファイル(つまり通常通り)があります。 MyInassClass型のMyClassで@propertyを作成します。次に、MySubClassでMyClass & MyInnerClassとMyClassの両方をインポートする必要があります。

+1

これは正しいです。簡単に言えば、サブクラスの実装では、.hファイルに定義されているものだけを見ることができ、内部クラスのすべての詳細は.mファイルにあります。 – jrturton

+0

私は実際にMyInnerClassのインターフェイスをMyClassの.hファイルに移動しましたが、今はすべてうまく動作しています...ちょうどこれがLOLであることがお勧めです –