web-dev-qa-db-ja.com

IOS:NSMutableArray initWithCapacity

私はこの状況にあります

array = [[NSMutableArray alloc] initWithCapacity:4]; //in viewDidLoad

if (index == 0){
    [array insertObject:object atIndex:0];
}

if (index == 1){
    [array insertObject:object atIndex:1];
}

if (index == 2){
    [array insertObject:object atIndex:2];
}

if (index == 3){
    [array insertObject:object atIndex:3];
}

しかし、オブジェクトを順番に挿入すると、すべて問題ありません。代わりに、0と3の順に配列を埋めると、うまく機能しません。なぜですか?

19
CrazyDev

容量が4であっても、インデックス3のNSMutableArrayにオブジェクトを挿入することはできません。可変配列には、オブジェクトの数と同じ数の使用可能な「セル」があります。可変配列に「空のセル」を含める場合は、[NSNull null]オブジェクトを使用する必要があります。これは、データがないことを意味する特別なスタブオブジェクトです。

NSMutableArray *array = [[NSMutableArray alloc] init];

for (NSInteger i = 0; i < 4; ++i)
{
     [array addObject:[NSNull null]];
}

[array replaceObjectAtIndex:0 withObject:object];
[array replaceObjectAtIndex:3 withObject:object];
54
Zapko

Cスタイルでは、int a[10]はサイズ10の配列を作成し、0から9までの任意のインデックスに任意の順序でアクセスできます。ただし、これはinitWithCapacityまたはarrayWithCapacityには当てはまりません。これは、基盤となるシステムがパフォーマンスを向上させるために使用できるヒントにすぎません。これは、順不同で挿入できないことを意味します。サイズnの可変配列がある場合は、インデックス0からnまで、0からn-1は既存の位置用、nは終了位置に挿入できます。したがって、0、1、2、3が有効です。ただし、0、3、または1,2の順序は無効です。

11
taskinoor

ランダムなインデックスを挿入することはできません。これを行う場合は、最初に配列をnullオブジェクトで初期化してから、replaceObjectAtIndexを呼び出します。

0
saadnib