Introducción
A veces necesitas manejar conjuntos de datos. Por ejemplo podrías necesitar tener una lista de cadenas de texto. Podría ser bastante molesto usar una variable para cada una de esas cadenas. Por supuesto hay una solución mejor: el array.
Un array es una lista ordenada de objetos (o, más exactamente, una lista de punteros a objetos). Puedes añadir objetos al array, eliminarlos o preguntarle qué objeto está almacenado en determinado índice (es decir, en una determinada posición). También puedes preguntarle cuántos elementos contiene.
Cuando contamos elementos, generalmente comenzamos a contar por 1. Pero en los arrays el primer elemento tiene el índice 0, el segundo tiene índice 1 y así sucesivamente.

Ejemplo: un array que contiene tres strings
Más tarde veremos ejemplos de código, que nos permitirán entender el efecto de empezar a contar por 0.
Tenemos dos clases para manejar arrays:
NSArray
y NSMutableArray
. Igual que con las cadenas, hay una versión mutable y una inmutable. En este capítulo vamos a usar la versión mutable.Éstos son arrays exclusivos de Objective-C y Cocoa. Hay también un tipo simple de array propio del lenguaje C (y por tanto también parte de Objective-C) del que no vamos a hablar aquí. Te lo advertimos por si más tarde lees algo sobre los arrays de C, que no tienen nada que ver con las clases
NSArray
y NSMutableArray
.Un método de clase
Una forma de crear un array es ejecutar una instrucción como esta:
[NSMutableArray array];
Esto creará y devolverá un array vacío. Pero… espera un minuto… esto es extraño, ¿no? Estamos usando una clase (NSMutableArray) como receptora de un mensaje y hasta ahora siempre habíamos enviado mensajes a instancias (es decir, a objetos), no a clases.
Bien, pues acabamos de aprender algo nuevo: el hecho de que también podemos llamar a métodos de las clases (y eso se debe a que las clases son también objetos, instancias de lo que se llaman metaclases, pero no vamos a ir más allá en este artículo de introducción).
No tenemos que preocuparnos de liberar la memoria ocupada al alojar este objeto, ya que se produce automáticamente por estar vinculado a un
NSAutoreleasePool
(ver el código que se genera automáticamente relativo al NSAutoreleasePool
en nuestros programas Xcode). Al llamar al método de clase estamos haciendo algo equivalente a:NSMutableArray *lista = [[[NSMutableArray alloc] init] autorelease];
En caso de que quisieras que el array permaneciera en memoria después de que se libere el objeto
NSAutoreleasePool
deberías enviar un mensaje -retain
a la instancia.En la documentación de Cocoa, los métodos de clase están precedidos de un símbolo "+", en lugar del símbolo "-" que hemos visto hasta ahora para los métodos de instancia (ver por ejemplo el capítulo 8, [4.4]). Por ejemplo, en la documentación del método "array" leemos:
array
+ (id)array
Creates and returns an empty array. This method is used by mutable subclasses of NSArray. See Also: + arrayWithObject:, + arrayWithObjects:
Ejercicio
Vamos a escribir código. El siguiente programa crea un array vacío, almacena en él tres cadenas y después muestra el número de elementos en el array.
//[1] #import <foundation/foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSMutableArray *miArray = [NSMutableArray array]; [miArray addObject:@"primera cadena"]; [miArray addObject:@"segunda cadena"]; [miArray addObject:@"tercera cadena"]; int cantidad = [miArray count]; NSLog(@"Hay %d elementos en mi array", cantidad); [pool release]; return 0; }
Cuando se ejecute, este programa mostrará:
Hay 3 elementos en mi array
El siguiente programa es como el anterior excepto que muestra la cadena almacenada en el índice 0 del array. Para obtenerla, usaremos el método
objectAtIndex:
[2.9].//[2] #import <foundation/foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSMutableArray *miArray = [NSMutableArray array]; [miArray addObject:@"primera cadena"]; [miArray addObject:@"segunda cadena"]; [miArray addObject:@"tercera cadena"]; NSString *elemento = [miArray objectAtIndex:0]; // [2.9] NSLog(@"El elemento en el índice 0 del array es: %@", elemento); [pool release]; return 0; }
Cuando se ejecute, mostrará:
El elemento en el índice 0 del array es: primera cadena
A veces tienes que recorrer un array para hacer algo con cada uno de sus elementos. Para ello puedes usar un bucle como el que mostramos a continuación, en el que mostramos cada elemento del array además de su índice:
//[3] #import <foundation/foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSMutableArray *miArray = [NSMutableArray array]; [miArray addObject:@"primera cadena"]; [miArray addObject:@"segunda cadena"]; [miArray addObject:@"tercera cadena"]; int i; int cantidad; for (i = 0, cantidad = [miArray count]; i < cantidad; i = i + 1) { NSString *elemento = [miArray objectAtIndex:i]; NSLog(@"El elemento en el índice %d del array es: %@", i, elemento); } [pool release]; return 0; }
Cuando se ejecute, el programa mostrará:
El elemento en el índice 0 del array es: primera cadena El elemento en el índice 1 del array es: segunda cadena El elemento en el índice 2 del array es: tercera cadena
Ten en cuenta que los arrays no están limitados a contener cadenas. Pueden contener cualquier objeto que quieras.
Las clases
NSArray
y NSMutableArray
proporcionan otros muchos métodos, y recomendamos que mires la documentación de estas clases para aprender más sobre arrays. Terminaremos este capítulo hablando del método que permite reemplazar un objeto por otro en un índice determinado. Este método se llama replaceObjectAtIndex:withObject:
.Hasta ahora hemos utilizado métodos que requieren como mucho un argumento. Pero éste es diferente porque necesita dos argumentos, tal como puedes advertir al tener dos caracteres "dos puntos (:)" en el nombre del método. Vamos a ver cómo usar este método:
//[4] [miArray replaceObjectAtIndex:1 withObject:@"Hola"];
Después de la ejecución, en el índice 1 estará la cadena
@"Hola"
. Por supuesto sólo se debe llamar a este método con un índice válido, es decir, debe haber ya un objeto en ese índice para que pueda ser sustituido por el objeto que le pasamos.Conclusión
Como puedes ver, los nombres de métodos en Objective-C son como instrucciones con espacios vacíos en medio (precedidos del carácter "dos puntos"). Cuando invocas al método debes insertar el valor en esos espacios, creando una instrucción llena de sentido. Esta sintaxis de nombre e invocación de métodos viene del lenguaje Smalltalk y es uno de los logros más importantes de Objective-C, ya que hace el código muy expresivo. Cuando crees tus propios métodos deberías recordar llamarlos de forma que crees una instrucción con pleno significado cuando se llamen. Esto hará el código más legible, lo que facilitará el mantenimiento posterior de los programas.
No hay comentarios:
Publicar un comentario