2010-01-28 6 views

Répondre

9

La méthode NSArray initWithCapacity prend un entier non signé en argument. Donc, quelle que soit la valeur maximale d'un int non signé sur votre plate-forme peut être la limite théorique. Cependant, la limite réelle est plus susceptible de dépendre de la quantité de mémoire disponible. NSArray est un conteneur de pointeurs vers d'autres objets.

+4

'NSUInteger', pas' int' non signé. Sur les architectures 64 bits, 'unsigned int' est toujours à 4 octets, alors que' NSUInteger' - qui est ce que NSArray utilise depuis Leopard - est 8. –

+2

Il n'est pas correct de supposer que le nombre maximum d'objets NSUIntegerMax. Comme le souligne jsmp, NSArray utilise NSNotFound. NSNotFound est défini comme NSIntegerMax qui est inférieur à NSUInteger. Cela implique que le nombre maximum d'objets est NSIntegerMax-1. Je voudrais tester cela comme le suggère Dave Delong mais je n'ai plus de mémoire! –

+0

Espérons que vous avez assez de RAM pour contenir 180 fois plus d'informations que le Lt. Cmd. Les données! http://www.wolframalpha.com/input/?dataset=&i=(1*(2%5E64)+%2B+8+%2B+8)+bytes –

3

Probablement plus que votre RAM peut gérer.

1

Sa capacité maximale est définie par NSUInteger (sur les dernières versions des systèmes d'exploitation disponibles):

Lors de la construction des applications 32 bits, NSUInteger est un entier non signé 32 bits . Une application 64 bits traite NSUInteger en tant que 64 bits non signé entier

Par conséquent, quelle que soit la taille de NSUInteger est sur un périphérique donné est le nombre maximum de pointeurs d'objets qu'il peut contenir. Cependant, comme Eimantas l'a fait allusion dans sa réponse, ce n'est pas la même chose que «combien d'objets peuvent-ils contenir» parce que cela dépend de la mémoire disponible. Vous n'avez pas assez de RAM disponible à un moment donné pour allouer un tableau avec six milliards de slots par exemple ...

5

Dans la plupart des cas concernant les limites supérieures des structures de programmation et similaires:
"Si vous devez demander , vous le faites probablement mal "- TheDailyWTF.com

10

Avez-vous essayé de le savoir? ;)

NSMutableArray * a = [[NSMutableArray alloc] init]; 
NSUInteger i = 0; 
@try { 
    while (1) { 
    [a addObject:@"hi"]; 
    i++; 
    } 
} @catch (NSException * e) { 
    NSLog(@"added %llu elements", i); 
} 
+0

Delong pendant que j'essaie votre idée et trouve la limite de taille , cette application se bloque et obtient une erreur lorsque le programme reçoit le signal: "0". Data Formatters temporairement indisponible, ré-essayer après un «continuer».(Erreur inconnue lors du chargement de la bibliothèque partagée "/Developer/usr/lib/libXcodeDebuggerSupport.dylib") –

+3

vous avez manqué de mémoire. Il suffit de consigner ce que je vois à chaque itération et de le laisser s'écraser, le dernier journal vous dira combien vous pourriez obtenir. En passant, votre test vous indique que la taille est limitée à la mémoire. –

3

NSNotFound est défini comme NSIntegerMax (cette valeur change si vous êtes sur un système 32 bits ou 64 bits)

NSNotFound est aussi le résultat que vous obtenez lorsque vous faites un

[NSArray IndexOfObject: obj]

et aucun objet n'a été trouvé.

Si vous ne manquez pas d'espace/mémoire, je dirais que ce serait votre limite.

http://developer.apple.com/library/mac/#documentation/cocoa/reference/foundation/Miscellaneous/Foundation_Constants/Reference/reference.html

Questions connexes