9

同じ値のオブジェクト(たとえば、NSNumberがすべて1に初期化されている)を使用してNSArrayを作成したいのですが、カウントは別の変数に基づいています。Cスタイルの配列を扱うものを除いて、NSArrayのイニシャライザーのいずれかでこれを行う方法はないようです。

これを行うための短い方法があるかどうか何か考えはありますか?

これは私が探しているものです:

NSArray *array = [[NSArray alloc] initWithObject:[NSNumber numberWithInt:0]
                                           count:anIntVariable];

NSNumberはここでの単なる一例であり、基本的に任意のNSObjectである可能性があります。

4

4 に答える 4

15

このために私が書くことができた最もタイトなコードは次のとおりです。

id numbers[n];
for (int x = 0; x < n; ++x)
    numbers[x] = [NSNumber numberWithInt:0];
id array = [NSArray arrayWithObjects:numbers count:n];

これが機能するのは、Xcode がデフォルトで使用する C99 を使用して、ランタイムの長さによって決定される C 配列を作成できるためです。

それらがすべて同じ値である場合は、memset を使用することもできます (ただし、int へのキャストは不適切です)。

id numbers[n];
memset(numbers, (int)[NSNumber numberWithInt:0], n);
id array = [NSArray arrayWithObjects:numbers count:n];

必要なオブジェクトの数がわかっている場合、このコードは機能するはずですが、私はテストしていません。

id array = [NSArray arrayWithObjects:(id[5]){[NSNumber numberWithInt:0]} count:5];
于 2011-11-02T10:58:04.630 に答える
3

変更不可能な形式のこの構造が役立つ理由はわかりませんが、あなたには理由があると確信しています。

NSMutableArrayを使用し、forループを使用してビルドする以外に選択肢はないと思います。結果が変更可能でないことが非常に重要な場合は、NSArrayを作成してarrayWithArrayを使用します。

于 2009-07-01T22:38:51.697 に答える
2

@mmcに同意します。(同じオブジェクトをN回使用するのではなく)そのような構造を持つ正当な理由があることを確認してください。ただし、そうすることを前提としています。

少し高速な不変配列を作成する別の方法がありますが、オブジェクトのC配列を作成し、それをNSArrayの+ arrayWithObject:count:メソッド(自動解放された配列を返します)に渡す必要があります。

id anObject = [NSNumber numberWithInt:0];
id* buffer = (id*) malloc(sizeof(id) * anIntVariable);
for (int i = 0; i < anIntVariable; i++)
  buffer[i] = anObject;
NSArray* array = [NSArray arrayWithObjects:buffer count:anIntVariable];
free(buffer);

さらにトリッキーなポインタ計算でも同じことを達成できますが、ゲインはかなり些細なものです。とにかく興味があればコメントしてください。

于 2009-07-01T23:09:28.500 に答える
2

おそらく、NSArray にそのようなメソッドがない理由は、セマンティクスが明確に定義されていないためです。あなたの場合、不変の NSNumber を使用すると、すべての異なるセマンティクスが同等になりますが、追加するオブジェクトが、たとえば NSMutableString のような可変オブジェクトであると想像してください。

3 つの異なるセマンティクスがあります。

  • 保持— 同じ変更可能な文字列への 10 個のポインターで終わることになり、いずれかを変更すると 10 個すべてが変更されます。

  • コピー— 同じ不変文字列への 10 個のポインター、または同じ値を持つ不変文字列への 10 個の異なるポインターで終わる可能性がありますが、いずれにしても、それらのいずれも変更することはできません。

  • mutableCopy — 最終的に 10 個の可変文字列オブジェクトが作成され、いずれも個別に変更できます。

したがって、Apple はメソッドの 3 つのバリアントを作成するか、セマンティクスを制御する何らかのパラメーターを使用することができますが、どちらも醜いため、代わりにコードを作成することをあなたに任せました。必要に応じて、それを NSArray カテゴリ メソッドとして追加できます。セマンティック オプションを理解し、明確にしてください。

メソッド:

-(id)initWithArray:(NSArray *)array copyItems:(BOOL)flag

これと同じ問題があります。

arrayWithObjects:count: を使用したクインのソリューションはかなり良いものであり、おそらく一般的なケースで得られる最高のものです。それを NSArray カテゴリに入れてください。

于 2009-07-02T03:11:00.667 に答える