2009-06-24 11 views
1

他の言語では、クラスを作成してそのクラスのオブジェクトの配列を作成することができます。たとえばclass priceで、priceクラスのpriceクラスを使用してprice [] priceを定義します。Objective Cカスタム配列を作成する

私はこれをうまく動作させることができません。どうしますか?

価格クラスはNSObjectの継承ですが、NSMutableArrayを使用できますか?

+0

私はあなたが何を求めているのかは分かりません...あなたは言い換えることができますか? 価格クラスのインスタンスの配列、または価格クラスのivarであるNSArray ...などが必要ですか? あなたができないことを達成しようとしているのは正確ですか? – Walker

+0

そして、あなたは "カスタムアレイ"を作ることができると言うでしょうか?他の言語で Cと同様? C/C++の場合は、私が先に述べたように、あなたが何を求めているのかよく分からないので、あなたがそこでそれをどうやってやるのかというスケルトンの例を与えることができますか? – Walker

答えて

1

はい、NSMutableArrayは使いたいものです。

1

あなたの最後の質問にまず答える:Objective-Cオブジェクト(NSObjectから継承する)のインスタンスを格納している場合は、NSMutableArrayを使用します。ただし、プリミティブ型(int,BOOL,char,char*など)では機能しません。

Objective-Cは、1つの注意点がある配列を宣言するCの方法を使用します。スタック上にメモリを割り当てることはできません(これはCで行われます)。つまり、malloc(Leopard以降ではNSAllocateCollectable()を好む)とfreeを使用してメモリを管理する必要があります。また、配列またはポインタへのポインタとして配列を宣言します。このような何か:(注:薄い空気から引き出さ、テストされていない)

Price **prices = malloc(numberOfEntries * sizeof(Price*)); 
... 
free(prices); 

NSMutableArrayのを使用するには、一般的に、独自の配列を管理するよりもはるかに簡単です。コレクションは、オブジェクトが挿入されたときに-retainと呼び出され、オブジェクトが削除されたときには-release(コレクションが割り当て解除された場合はすべてのオブジェクト)が呼び出されます。

2

クラスPriceを持ち、それがNSObjectから継承している場合、その配列をNSArrayまたはNSMutableArrayに格納することができます。また、C配列やSTLベクタに格納することもできますが、その場合はメモリ管理が難しい場合があります。

NSArray/NSMutableArrayの場合、配列はオブジェクトの所有権参照を取得するため、配列に追加した後に解放することができ、配列から削除されるまでメモリに残ります他のすべての場所)。解放されると、それに含まれるすべての価格オブジェクトが解放(および潜在的に割り当て解除)されます

NSMutableArray* a = [NSMutableArray array]; 
[a addObject:[Price price]]; 
// and/or 
[a addObject:[[[Price alloc] init] autorelease]; 
// and/or 
Price* p = [[Price alloc] init]; 
[a addObject:p]; 
[p release]; 
NSLog(@"The array is %@", a); 
// Remember at this point you do not "own" a, retain it if you want to keep it, or use [NSMutableArray new] above 

コードは、次のようになります。

関連する問題