2010-04-11 3 views
3

Ceci est ma méthode init:La méthode de comptage NSMutableArray indique que NSMutableArray est le nombre 0?

-(id)init{ 

    self = [super init]; 
    magicNumber = 8; 

    myMagicArray = [[NSMutableArray alloc] initWithCapacity:(magicNumber*magicNumber)]; 
    NSLog(@"this is the magic Array: %d", [myMagicArray count]); 

    return self; 
} 

C'est le .h:

@interface Magic : NSObject { 
    NSMutableArray *myMagicArray; 
    int magicNumber; 

} 

La console me montre ce nombre est égal à 0. au lieu de 64, en poids de se produire? Je vérifie déjà ce post:

StackOverflow Link: https://stackoverflow.com/questions/633699/nsmutablearray-count-always-returns-zero

Répondre

8

Vous confondez la capacité avec le comte. La capacité est seulement l'espace mémoire réservé pour le tableau, donc quand le tableau se développe il n'a pas besoin de prendre le temps d'allouer de la mémoire.

Le nombre est le nombre réel d'éléments stockés dans le tableau.

La méthode -initWithCapacity: crée un tableau vide avec une indication de la taille de la baie pouvant atteindre avant une réallocation de la mémoire. Le nombre augmente lorsque vous avez réellement -addObject: à la matrice.


,———.———.———.———————————————————————————————————. 
| 4 | 6 | 8 | <—— room for array to expand ———> | 
'———'———'———'         | 
| count = 3          | 
|            | 
'——— memory reserved (capacity) of the array ———' 
         > 3 
+2

Alors, comment puis-je obtenir le numéro de capacité? Je veux dire, le 64 ... dans ce cas .... – Tattat

+0

Je veux remplir le NSMutableArray ... ... – Tattat

+5

Vous n'avez pas besoin de la capacité. C'est une optimisation, et en fonction de la capacité que vous spécifiez et de l'algorithme interne choisi par NSArray, vous risquez d'être ignoré. Ajoutez simplement les objets quand vous les obtenez, en utilisant -addObject: ou -insertObject :. Différent d'un CFArray, la capacité d'un NSArray n'est pas une limite stricte. C'est juste une suggestion. Si vous obtenez vos objets dans un ordre aléatoire (mais avec un numéro d'index), vous pouvez créer un tableau et le remplir avec des objets [NSNull null] en utilisant -addObject: puis remplacer le NSNull par l'objet réel . Mais ce dernier est rarement nécessaire. – uliwitness

1

La capacité « initWithCapacity » réserves de méthode excès afin que les insertions ultérieures ne doivent pas redimensionner le tableau (jusqu'à ce que vous avez dépassé la capacité initialement réservée), alors que « compte » vous indique la réelle nombre d'éléments dans le tableau (c'est-à-dire le nombre que vous avez inséré) et non la capacité totale disponible.

0

Lorsque vous initialisez myMagicArray, vous créez un espace mémoire pour celui-ci ... dans ce cas, suffisamment de mémoire pour contenir 64 objets. Mais vous n'avez pas encore ajouté d'objets, le compte est donc 0 jusqu'à ce que vous ajoutiez un objet.

+0

Alors, puis-je obtenir le numéro de capacité? – Tattat

0

Vous ne pouvez pas accéder à la propriété capacity, et cela ne représente pas rempli taille (comme décrit avec éloquence par kennytm).

Une approche pourrait consister à dériver une classe de NSMutableArray et intercepter la méthode initWithCapacity, pour enregistrer la initialCapacity puis baratter dans une propriété . Mais si vous êtes pressé, vous pouvez utiliser cette méthode simple ci-dessous:

Créer une fonction:

NSMutableArray* createArrayWithSize(NSUInteger number) 
{ 
    NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity:number]; 
    for(NSUInteger i=0;i<number; i++) 
    { 
     array[i]=[NSNull null]; 
    } 
    return array; 
} 

ensuite votre NSMutableArray comme initialiser suit.

myMagicArray = createArrayWithSize(10); 

[myMagicArray count] sera désormais 10.