2010-01-28 11 views

risposta

9

Il metodo initWithCapacity NSArray, accetta un int unsigned come argomento. Quindi qualunque sia il valore massimo di un int unsigned sulla tua piattaforma potrebbe essere il limite teorico. Tuttavia, è più probabile che il limite effettivo dipenda dalla quantità di memoria disponibile.

+4

'NSUInteger', non' int' senza segno. Nelle architetture a 64 bit, 'unsigned int' è ancora 4 byte, mentre' NSUInteger', che è quello che NSArray usa da Leopard-8. 8. –

+2

Non è corretto assumere il numero massimo di oggetti NSUIntegerMax. Come sottolinea jsmp, NSArray utilizza NSNotFound. NSNotFound è definito come NSIntegerMax che è inferiore a NSUInteger. Ciò implica che il numero massimo di oggetti sia NSIntegerMax-1. Vorrei testarlo come suggerisce Dave Delong ma corro fuori se ricordo! –

+0

Spero che tu abbia abbastanza RAM per contenere 180 volte più informazioni di Lt. Cmd. Dati! http://www.wolframalpha.com/input/?dataset=&i=(1*(2%5E64)+%2B+8+%2B+8)+bytes –

3

Probabilmente più di quanto la RAM sia in grado di gestire.

1

NSArray è un contenitore di puntatori ad altri oggetti. La sua capacità massima è definito da NSUInteger (sulle ultime versioni di sistemi operativi disponibili):

Quando la creazione di applicazioni a 32 bit, NSUInteger è un 32 bit senza segno intero. Un'applicazione a 64 bit tratta NSUInteger come 64 bit senza segno intero

Pertanto, qualunque sia la dimensione del NSUInteger è in un dato dispositivo è il numero massimo di puntatori oggetto può contenere. Tuttavia, come ha fatto allusione Eimantas nella sua risposta, questo non è lo stesso di "quanti oggetti può contenere" perché questo dipende dalla memoria disponibile. Potrebbe non avere abbastanza RAM disponibile in un dato momento per allocare un array con sei miliardi di slot, ad esempio ...

5

Nella maggior parte dei casi relativi ai limiti superiori di strutture di programmazione e simili:
"Se devi chiedere , probabilmente stai sbagliando "- TheDailyWTF.com

10

Hai provato a scoprirlo? ;)

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 mentre sto provando la tua idea e scopri il limite di dimensione , l'app si arresta in modo anomalo e riceve un errore come segnale di ricezione del programma: "0". Formattatori di dati temporaneamente non disponibili, riprovare dopo un 'prosegui'.(Errore sconosciuto durante il caricamento della libreria condivisa "/Developer/usr/lib/libXcodeDebuggerSupport.dylib") –

+3

esaurimento della memoria. basta registrare quello che è a ogni iterazione e lasciarlo in crash, l'ultimo registro ti dirà quanti ne potresti ottenere. A proposito, il tuo test ti dice che la dimensione è limitata alla memoria. –

Problemi correlati