web-dev-qa-db-fra.com

IOS: NSMutableArray initWithCapacity

J'ai cette situation

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];
}

mais si j'insère dans l'ordre l'objet, tout va bien, mais si je remplis le tableau dans cet ordre: 0 et après 3, cela ne fonctionne pas bien, pourquoi ???

18
CrazyDev

Vous ne pouvez pas insérer d'objet à l'index 3 dans NSMutableArray même si sa capacité est de 4. Le tableau mutable a autant de "cellules" disponibles qu'il y a d'objets. Si vous voulez avoir des "cellules vides" dans un tableau mutable, vous devez utiliser des objets [NSNull null]. C'est un objet spécial qui signifie pas de données ici.

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];
52
Zapko

En C, le style int a[10] crée un tableau de taille 10 et vous pouvez accéder à n’importe quel index de 0 à 9 dans n’importe quel ordre. Mais ce n'est pas le cas avec initWithCapacity ou arrayWithCapacity. C'est simplement un indice que le système sous-jacent peut utiliser pour améliorer les performances. Cela signifie que vous ne pouvez pas insérer hors service. Si vous avez un tableau mutable de taille n, vous pouvez uniquement insérer d'index 0 à n, de 0 à n-1 pour les positions existantes et de n pour l'insertion en fin de position. Donc 0, 1, 2, 3 est valide. Mais l'ordre 0, 3 ou 1,2 n'est pas valide.

10
taskinoor

Vous ne pouvez pas insérer d'index aléatoire, si vous voulez le faire, commencez par initialiser votre tableau avec des objets nuls, puis appelez replaceObjectAtIndex.

0
saadnib