2010-01-28 13 views

Respuesta

9

El método NSArray initWithCapacity toma un int sin signo como argumento. Entonces, cualquiera que sea el valor máximo de una int sin firmar en su plataforma, puede ser el límite teórico. Sin embargo, es más probable que el límite real dependa de la cantidad de memoria que tenga disponible.

+4

'NSUInteger', no' int' sin firmar. En arquitecturas de 64 bits, 'int' sin signo es todavía 4 bytes, mientras que' NSUInteger'-que es el que utiliza NSArray desde Leopard-es 8. –

+2

No es correcto asumir que el número máximo de objetos NSUIntegerMax. Como jsmp señala, NSArray usa NSNotFound. NSNotFound se define como NSIntegerMax que es menor que NSUInteger. Esto implica que la cantidad máxima de objetos es NSIntegerMax-1. ¡Lo probaría como sugiere Dave Delong, pero me agoto la memoria! –

+0

Espero que tengas suficiente memoria RAM para almacenar 180 veces más información que Lt. Cmd. ¡Datos! http://www.wolframalpha.com/input/?dataset=&i=(1*(2%5E64)+%2B+8+%2B+8)+bytes –

3

Probablemente más que la memoria RAM puede manejar.

1

NSArray es un contenedor de punteros a otros objetos. Su capacidad máxima se define por NSUInteger (en las últimas versiones de los sistemas operativos disponibles):

Cuando la construcción de aplicaciones de 32 bits, NSUInteger es un 32 bits sin signo entero. Una aplicación de 64 bits trata NSUInteger como 64 bits sin signo número entero

Por lo tanto, cualquiera que sea el tamaño de NSUInteger está en un dispositivo dado es el número máximo de punteros de objeto que puede contener. Sin embargo, como aludió Eimantas en su respuesta, esto no es lo mismo que "cuántos objetos puede contener" porque esto depende de la memoria disponible. Puede que no tenga suficiente memoria RAM disponible en un momento dado para asignar una matriz con seis mil millones de ranuras por ejemplo ...

5

En la mayoría de los casos relativos a los límites superiores de las estructuras de programación y similares:
"Si usted tiene que preguntar , probablemente lo estés haciendo mal "- TheDailyWTF.com

10

¿Has intentado averiguarlo? ;)

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 mientras estoy tratando su idea y averiguar límite de tamaño , esa aplicación se bloquea y recibe un error como señal de programa recibida: "0". Los formateadores de datos temporalmente no disponibles, se volverán a intentar después de un 'continuar'.(Error desconocido al cargar la biblioteca compartida "/Developer/usr/lib/libXcodeDebuggerSupport.dylib") –

+3

se ha quedado sin memoria. simplemente registra lo que soy en cada iteración y deja que se cuelgue, el último registro te dirá cuántos puedes obtener. Por cierto, tu prueba te dice que el tamaño solo está limitado a la memoria. –

Cuestiones relacionadas