2009-07-13 26 views
1

私はObjective-Cオブジェクトの2次元C配列を持っています。これらのオブジェクトのメンバーにアクセスするにはどうすればよいですか?私は配列に格納されたボールオブジェクトのサイズにアクセスするにはどうすればよいObjective-Cオブジェクトの2次元C配列の使用方法は?

int size; 
CGPoint point; 

[0] [0]:

id array[5][5]; 
array[0][0] = [[Ball alloc] init]; 

ボールクラスには、二つの部材を持っていますか?どうすればいいのか教えてください。

ありがとうございます!

答えて

3

たランタイム(32ビットまたは64ビット)に応じて、あなたが明示的にインスタンス変数(sizepoint)を宣言したり、ランタイムによって合成されているかどうか、あなたはarray[0][0]->sizeのようにそれらを直接アクセスすることができます。 これは良い考えではありませんしかし。現代のランタイムでは破損し、ではなく、 Objective-Cの方法で、クラスの実装の詳細を公に公開してカプセル化を解除します。

Objective-C 2.0では、正確に表示したい各属性のプロパティを宣言するのが正しい方法です。あなたは今((Ball*)array[0][0]).sizeのような大きさにアクセスすることができます

@synthesize size; 
@synthesize point; 

@property (assign) int size; 
@property (assign) CGPoint point; 

そしてBall@implementationブロック内:Ball@interface宣言に次の行を追加します。キャストは、コンパイラがドット表記をプロパティアクセスとして認識するために必要です。アクセサメソッド(@synthesizeによって自動的に生成される)を使用する場合は、必ずしも必要ではありません。[array[0][0] size]

2

あなたの質問に完全に関連していないかもしれませんが(単純な例を使用しています)、この場合はオブジェクトの代わりに構造体を使用してください。サイズとポイントの両方が非オブジェクトなので、より意味をなさないかもしれません。

1

あなたはこのようにそれを行うことができます:

@interface Moo : NSObject { 
@public 
    int age; 
} 

そして、あなたは警告なしにこれを行うことができます:

Moo *m = [[Moo alloc] init]; 
m->age = 16; 
Moo *arr[4]; 
arr[0] = m; 
printf("Age: %d",arr[0]->age); 

あなたはまた、いくつかの鋳造を行うことができます:

id arr[4]; 
arr[0] = m; 
printf("Age: %d",((Moo *)arr[0])->age); 

これをすべきです任意の次元の配列を扱うことができます! これが役立つことを願っています。

+0

Objective-Cでこれを行うには、インスタンス変数を公開するのは良い方法ではありません。それは脆弱なコードになります。上記のBarryのソリューションをお勧めします。 –

+4

彼が尋ねたのは、それをやる方法でした。 – micmoo