¿Cómo declarar una matriz bidimensional de tipo de cadena en Objective-C?

¿Cómo declaro una matriz bidimensional de tipo de cadena en Objective-C?

En primer lugar, puede considerar usar una clase para mantener las cadenas de su matriz interna o cargarla desde un archivo plist (en el cual es fácil hacer una 2da serie de cadenas).

Para declaraciones directas, tiene un par de opciones. Si desea utilizar un NSArray, deberá crear manualmente la estructura de esta manera:

NSMutableArray *strings = [NSMutableArray array]; for(int i = 0; i < DESIRED_MAJOR_SIZE; i++) { [strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]]; } 

O bien, utilizando literales de matriz, puede obtener una versión inmutable como esta:

 NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ] 

Puede usarlo así:

 NSString *s = [[strings objectAtIndex:i] objectAtIndex:j]; 

Esto es algo incómodo de inicializar, pero es el camino a seguir si desea utilizar los métodos NSArray.

Una alternativa es usar matrices en C:

 NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil 

Y luego úsalo así:

 NSString *s = strings[i][j]; 

Esto es menos incómodo, pero debe tener cuidado de retener / copiar y liberar valores a medida que los inserta y quita de la matriz. (¡A menos que esté usando ARC, por supuesto!) NSArray haría esto por usted, pero con matrices de estilo C, debe hacer algo como esto para reemplazar una matriz:

 [strings[i][j] release]; strings[i][j] = [newString retain]; 

La otra diferencia es que puede poner nil en la matriz de estilo C, pero no en las NSArrays, necesita usar NSNull para eso. También eche un vistazo a Stack Overflow question Cocoa: Administración de memoria con NSString para obtener más información sobre la administración de la memoria NSString.

Si desea declarar e inicializar una matriz bidimensional de cadenas, puede hacer esto:

 NSArray *myArray = [NSArray arrayWithObjects: [NSArray arrayWithObjects:@"item 1-1", @"item 1-2", nil], [NSArray arrayWithObjects:@"item 2-1", @"item 2-2", nil], [NSArray arrayWithObjects:@"item 3-1", @"item 3-2", nil], [NSArray arrayWithObjects:@"item 4-1", @"item 4-2", nil], nil]; 

Esto tiene el beneficio de darte una matriz inmutable.

Puede que sea auto publicidad, pero escribí un contenedor sobre NSMutableArray para NSMutableArray fácilmente como una matriz 2D. Está disponible en GitHub como CRL2DArray aquí. https://github.com/tGilani/CRL2DArray