0

MyClass 型の 10 個のオブジェクトの固定サイズで配列を宣言する方法と、効率、コーディングの容易さ、またはその他のためのこれらのさまざまな代替手段の意味がわかりません。

...新しい xCode4.4 機能を念頭に置いてください。特に:

  • NSArray および NSDictionary クラスでは、Objective-C リテラルがサポートされています。
  • Objective-C コンテナー オブジェクトでは、'[ ]' 構文を使用した添字付けがサポートされています。

...そしてもちろんARCを使用

特に、結果としてこれらの配列を返すコンストラクター メソッドを記述する必要があります。

代替案1

  MyClass* objectOfMyClass;
  MyClass* array1[10];
  array1[5] = objectOfMyClass;

メソッドの宣言:

- (MyClass*[]) createArray {   <--- is this declaration correct like this ?

ps。私の知る限り、これらの配列はスタックメモリに置かれていますが、よくわかりません!

代替案2

    MyClass* objectOfMyClass;

    NSMutableArray *array2 = [[NSMutableArray alloc] init];
    for (int i = 0; i<10; i++)
        [array2 addObject:objectOfMyClass]; //objects get added in some way...
    //can't directly access nTh object in this case, need to add from 0 to 9
    //conversion to non mutable array, since size will not change anymore
    NSArray *array3 = [NSArray arrayWithArray:array2]; 

メソッドの宣言:

- (NSArray*) createArray {

ps。私の知る限り、これらの配列はスタックではなくメインメモリに配置されていますが、よくわかりません!

代替案3

NSArray *array4 = [[NSArray alloc] init];
array4 = ...how to prepare the array so it can hold 10 objects without using NSMutableArray ?
            otherwise I do not see a difference to alternative 2...
for (int i = 0; i<10; i++)
    array4[i] = objectOfMyClass];

メソッドの宣言:

- (NSArray*) createArray {

これに光をもたらしてくれてありがとう!

4

1 に答える 1

1

ここにリテラルに関する素晴らしい記事があります。代替案 1 を実行することはできません。これを実行する最善の方法は次のとおりです。

NSMutableArray *holdsMyClass = [NSMutableArray arrayWithCapacity:10]; // sized so array does not need to realloc as you add stuff to it

サイズを超えてインデックスを付けて配列のサイズを任意に増やすことはできません-インデックス5のオブジェクトがある場合は、それを置き換えることができます:

holdsMyClass[5] = obj;

たとえば、これをコンパイルしようとすると失敗します。

- (NSArray*[]) createArray
{
    NSArray *foo[10];
    foo[2] = [NSArray array];

    return foo;
}

このエラーが生成されます:「配列初期化子は初期化子リストでなければなりません」

于 2012-08-07T21:01:28.313 に答える