IOS: NSMutableArray initWithCapacity - PullRequest
       7

IOS: NSMutableArray initWithCapacity

19 голосов
/ 22 апреля 2011

У меня такая ситуация

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, он не будет работать нормально, почему ???

Ответы [ 4 ]

54 голосов
/ 22 апреля 2011

Вы не можете вставить объект с индексом 3 в NSMutableArray, даже если его емкость равна 4. В изменяемом массиве столько доступных «ячеек», сколько в нем объектов. Если вы хотите, чтобы в пустом массиве были «пустые ячейки», вы должны использовать [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];
11 голосов
/ 22 апреля 2011

В стиле C int a[10] создает массив размером 10, и вы можете получить доступ к любому индексу от 0 до 9 в любом порядке. Но это не относится к initWithCapacity или arrayWithCapacity. Это просто подсказка, которую базовая система может использовать для повышения производительности. Это означает, что вы не можете вставить из строя. Если у вас есть изменяемый массив размера n, вы можете вставить только от индекса 0 до n, от 0 до n-1 для существующих позиций и n для вставки в конечной позиции. Таким образом, 0, 1, 2, 3 является действительным. Но 0, 3 или 1,2 ордера недействительны.

0 голосов
/ 22 апреля 2011

Вы не можете вставить любой случайный индекс, если вы хотите сделать это, то сначала инициализируйте ваш массив с нулевыми объектами, затем вызовите replaceObjectAtIndex.

0 голосов
/ 22 апреля 2011

Вы не можете сначала вставить, например, в индекс 0, затем в индекс 2 вы должны вставить пошаговую вставку в 0,1,2,3,4,5 ....., n Что вы хотите сделать ??? В чем твоя проблема ???

Вы можете попытаться создать массив, затем инициализировать его с нулевыми элементами и после этого вставить в него !!! Я думаю, что это будет работать !!!

...