objective c.docx

21
LENGUAJE DE POO: OBJECTIVE C PRESENTADO POR: JULIAN MEJIA EDGAR RIVERA CURSO: PROGRAMACION III GRUPO: AD PRESENTADO A: CARLOS HENRIQUEZ MIRANDA UNIVERSIDAD AUTONOMA DEL CARIBE

Upload: julianmejiaf123

Post on 18-Jan-2016

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: OBJECTIVE C.docx

LENGUAJE DE POO:

OBJECTIVE C

PRESENTADO POR:

JULIAN MEJIA

EDGAR RIVERA

CURSO:

PROGRAMACION III

GRUPO:

AD

PRESENTADO A:

CARLOS HENRIQUEZ MIRANDA

UNIVERSIDAD AUTONOMA DEL CARIBE

30/05/14

Page 2: OBJECTIVE C.docx

Introducción

En este trabajo desarrollaremos a fondo el lenguaje Objective C, adaptado principalmente en Mac OS X, iOS Y GNUstep.

Objective-C es un lenguaje de programación orientado a objetos creado como un superconjunto de C para que implementase un modelo de objetos. Originalmente fue creado por Brad Cox y la corporación StepStone en 1980. En 1988 fue adoptado como lenguaje de programación de NEXTSTEP y en 1992 fue liberado bajo licencia GPL para el compilador GCC.

Page 3: OBJECTIVE C.docx

¿Qué es Objective C?

Es un lenguaje de programación sencillo diseñado para permitir la sofisticada programación orientada a objetos nacido en la década de los 80, creado como un superconjunto de C. es decir, es posible compilar cualquier programa escrito en C con un compilador de Objective-C, y también se puede incluir libremente código en C dentro de una clase de Objective-C. Objective-C extiende el estándar ANSI del lenguaje C, proporcionando sintaxis para definir clases, métodos, así como otras estructuras que promueven la extensión dinámica de clases.Muchos de los conceptos tradicionales de orientación a objetos, como encapsulación, herencia, y polimorfismo, están presentes en Objective-C.

Objective-C es un superconjunto de la versión ANSI del lenguaje de programación C y soporta la misma sintaxis que C. Como con código C, puede definir sus ficheros de cabeceras y sus ficheros de código fuente para separar las declaraciones públicas de los detalles de la implementación de su código.

Características de C que están presentes en Objective-C son:

Sentencias de control de flujo (if, for, while...) Tipos de datos fundamentales, estructuras y punteros. Conversiones implícitas y explícitas entre tipos. El ámbito de las variables: Global, estáticas o locales. Las funciones y su sintaxis. Las directivas del preprocesador (añadiendo Objective-C las suyas, así como las

llamadas directivas del compilador).

¿Y entonces en qué se diferencian C++ y Objective-C?

Pues en muchas cosas, empezando por las influencias procedentes de las ideas de Smalltalk, lo cual hace de Objective-C un lenguaje muy limpio, pequeño y por ende, mucho más rápido y fácil de aprender que C++. Aun así, Objective-C es mucho menos usado que C++

Si se tuviese que elegir una característica que diferencie a Objective-C de otros lenguajes (ya no sólo de C++), ésta sería su dinamismo, en el sentido de que Objective-C es un lenguaje marcadamente dinámico. Muchas de las decisiones que otros lenguajes toman en tiempo de compilación, Objective-C las toma en tiempo de ejecución. Ejemplos:

En Objective-C, a diferencia de C++, los objetos siempre se crean en memoria dinámica.

Page 4: OBJECTIVE C.docx

Los atributos de una clase no tienen por qué estar tipificados estáticamente. la comprobación de la existencia de los métodos se lleve a cabo en tiempo de

ejecución. ¿Esto qué quiere decir? Pues que si por ejemplo llamásemos al método “imprimirHola” de nuestra clase “Saludar”, pero este no existe, el error nos saltaría durante la ejecución del programa y no durante la compilación.

Historia

A principios de los 80, el software se desarrollaba usando programación estructurada. La programación estructurada se estableció para ayudar a dividir los programas en pequeñas partes, haciendo más fácil el desarrollo cuando la aplicación se volvía muy grande. Sin embargo, como los problemas seguían creciendo al pasar el tiempo, la programación estructurada se volvió compleja dado el desorden de algunos programadores para invocar instrucciones repetitivamente, llevando a código spaghetti y dificultando la reutilización de código.

Muchos vieron que la programación orientada a objetos sería la solución al problema. De hecho, Smalltalk ya tenía solucionados muchos de estos problemas: algunos de los sistemas más complejos en el mundo funcionaban gracias a Smalltalk. Pero Smalltalk usaba una máquina virtual, lo cual requería mucha memoria para esa época, y era demasiado lento.

Objective-C fue creado principalmente por Brad Cox y Tom Love a inicios de los 80 en su compañía Stepstone. Ambos fueron iniciados en Smalltalk mientras estaban en el Programming Technology Center de ITT en 1981. Cox se vio interesado en los problemas de reutilización en el desarrollo de software. Se dio cuenta de que un lenguaje como Smalltalk sería imprescindible en la construcción de entornos de desarrollo potentes para los desarrolladores en ITI Corporation. Cox empezó a modificar el compilador de C para agregar algunas de las capacidades de Smalltalk. Pronto tuvo una extensión para añadir la programación orientada a objetos a C la cual llamó «OOPC» (Object-Oriented Programming in C). Love mientras tanto, fue contratado por Shlumberger Research en 1982 y tuvo la oportunidad de adquirir la primera copia de Smalltalk-80, lo que influyó en su estilo como programador.

Para demostrar que se hizo un progreso real, Cox mostró que para hacer componentes de software verdaderamente intercambiables sólo se necesitaban unos pequeños cambios en las herramientas existentes. Específicamente, estas necesitaban soportar objetos de manera flexible, venir con un conjunto de bibliotecas que fueran utilizables, y permitir que el código (y cualquier recurso necesitado por el código) pudiera ser empaquetado en un formato multiplataforma.

Page 5: OBJECTIVE C.docx

Sintaxis

Para escribir el programa clásico "Hola Mundo" para correr en consola, se puede utilizar el siguiente código:

#import <stdio.h>int main( int argc, const char *argv[] ) { printf( "Hola Mundo\n" ); return 0;}El código anterior se diferenci BN a de un código en C común por la primera instrucción #import, que difiere del #include del C clásico, pero la función printf("") es puramente C. La función propia de Objective-C para imprimir una cadena de caracteres en consola es NSLog(@""); utilizándola, el código anterior quedaría de la siguiente manera:

int main( int argc, const char *argv[] ) { NSLog( @"Hola Mundo\n" ); return 0;}

La sintaxis de objetos de Objective-C deriva de Smalltalk. Toda la sintaxis para las operaciones no orientadas a objetos (incluyendo variables primitivas, pre-procesamiento, expresiones, declaración de funciones y llamadas a funciones) son idénticas a las de C, mientras que la sintaxis para las características orientadas a objetos es una implementación similar a la mensajería de Smalltalk.

Clases

Como en otros lenguajes orientados a objeto, las clases en Objective-C proporcionan la estructura básica para encapsular datos con las acciones que operan con esos datos. Un objeto es una instancia en tiempo de ejecución de una clase, que contiene su propia copia en memoria de las variables de instancia declaradas por esa clase y punteros a los métodos de la clase.

La especificación de una clase en Objective-C requiere de dos piezas: la interfaz y la implementación. La parte de la interfaz contiene la declaración de la clase y define las variables de instancia y los métodos asociados con la clase. La interfaz normalmente se encuentra en un fichero .h. La parte de la implementación contiene el código para los métodos de la clase. Normalmente, la implementación se encuentra en un fichero .m.

La Figura 1 muestra la sintaxis de la declaración de una clase llamada MyClass, que hereda de la clase base NSObject. Siguiendo el nombre de la clase (y separado por dos puntos) está el nombre de la clase padre. Las variables de instancia (o miembros) de la clase están declaradas en un código de bloque delimitado por corchetes ({ and }). A

Page 6: OBJECTIVE C.docx

continuación del bloque de las variables de instancia se encuentra el listado de los métodos declarados por la clase. Un punto y coma indica el final de cada variable de instancia y cada declaración de método.

Declaración de la clase:

Cuando almacenamos objeto en variables, necesita usar un puntero. Objective-C permite tipado fuerte y débil para variables que contienen objetos. Punteros fuertemente tipados incluyen el nombre de la clase en la declaración de la variable. En su lugar, los punteros débilmente tipados usan el tipo id para objetos. Los punteros débilmente tipados se usan frecuentemente para cosas como colecciones de clases, donde la cantidad exacta de objetos en la colección puede ser desconocida. Si está acostumbrado a usar lenguajes fuertemente tipados, puede pensar que las variables débilmente tipadas pueden ocasionar problemas, pero en realidad permiten una tremenda flexibilidad y permiten un mayor dinamismo en programas Objective-C.

Métodos

Una clase en Objective-C puede declarar dos tipos de métodos: métodos de instancia y métodos de clase. Un método de instancia es un método cuya ejecución tiene como ámbito una instancia particular de la clase. En otras palabras, antes de que llames al método, primero debe crear una instancia de la clase. Los métodos de clase, por comparación, no requieren el crear una instancia, pero especificaremos eso más adelante.

De Clase

•+ (id)alloc; •+ (id)identifier;

De Instancia•- (id)init; •- (float)height; •- (void)walk;

Page 7: OBJECTIVE C.docx

La declaración de un método consiste en un identificador de tipo, un tipo de retorno, una o más palabras clave, y el tipo y nombre de parámetro. La imagen muestra la declaración del método de instancia insertObject:atIndex:

Sintaxis de la declaración de método:

Esta declaración está presida de un signo menos ( - ), que indica que es un método de instancia. El nombre del método (insertObject:atIndex:) es una concatenación de las palabras clave, incluyendo caracteres 'dos puntos'. Si un método no tiene parámetros, omite el primer ':' después de la primera (y única) palabra clave. En este ejemplo, el método tiene dos parámetros.

Cuando quiera llamar a un método, lo hace pasando mensajes a un objeto. El mensaje incluye las palabras claves del método junto a la información de los parámetros que el método necesite. Todos los mensajes que envíes a un objeto son enviados dinámicamente, para facilitar el comportamiento polimórfico de las clases de Objective-C.

Mensajes

El modelo de programación orientada a objetos de Objective-C se basa en enviar mensajes a instancias de objetos. Esto es diferente al modelo de programación al estilo de Simula, utilizado por C++ y esta distinción es semánticamente importante. En Objective-C uno no llama a un método; uno envía un mensaje, y la diferencia entre ambos conceptos radica en cómo el código referido por el nombre del mensaje o método es ejecutado. En un lenguaje al estilo Simula, el nombre del método es en la mayoría de los casos atado a una sección de código en la clase objetivo por el compilador, pero en Smalltalk y Objective-C, el mensaje sigue siendo simplemente un nombre, y es resuelto en tiempo de ejecución: el objeto receptor tiene la tarea de interpretar por sí mismo el mensaje. Una consecuencia de esto es que el mensaje del

Page 8: OBJECTIVE C.docx

sistema que pasa no tiene chequeo de tipo: el objeto al cual es dirigido el mensaje (conocido como receptor) no está inherentemente garantizado a responder a un mensaje, y si no lo hace, simplemente lo ignora y retorna un puntero nulo.

Enviar el mensaje method al objeto apuntado por el puntero obj requeriría el siguiente código en C++:

obj->method(parameter);

Mientras que en Objective-C se escribiría como sigue:

obj method:parameter]; [

Ambos estilos de programación poseen sus fortalezas y debilidades. La POO al estilo Simula permite herencia múltiple y rápida ejecución utilizando vinculación en tiempo de compilación siempre que sea posible, pero no soporta vinculación dinámica por defecto. Esto fuerza a que todos los métodos posean su correspondiente implementación, al menos que sean virtuales (aun así, se requiere una implementación del método para efectuar la llamada). La POO al estilo Smalltalk permite que los mensajes no posean implementación - por ejemplo, toda una colección de objetos pueden enviar un mensaje sin temor a producir errores en tiempo de ejecución. El envío de mensajes tampoco requiere que un objeto sea definido en tiempo de compilación. (Ver más abajo la sección tipado dinámico) para más ventajas de la ligadura dinámica.

Interfaces e implementaciones

Objective-C requiere que la interfaz e implementación de una clase estén en bloques de código separados. Por convención, la interfaz es puesta en un archivo cabecera y la implementación en un archivo de código; los archivos cabecera, que normalmente poseen el sufijo .h, son similares a los archivos cabeceras de C; los archivos de implementación (método), que normalmente poseen el sufijo .m, pueden ser muy similares a los archivos de código de C.

Interfaz

La interfaz de la clase es usualmente definida en el archivo cabecera. Una convención común consiste en nombrar al archivo cabecera con el mismo nombre de la clase. La interfaz para la clase Clase debería, así, ser encontrada en el archivo Clase.h.

La declaración de la interfaz de la forma:

@interface classname : superclassname { // instance variables}+classMethod1;+(return_type)classMethod2;+(return_type)classMethod3:(param1_type)parameter_varName;

Page 9: OBJECTIVE C.docx

Los signos más denotan métodos de clase, los signos menos denotan métodos de instancia. Los métodos de clase no tienen acceso a las variables de la instancia.

Implementación

La interfaz únicamente declara la interfaz de la clase y no los métodos en sí; el código real es escrito en la implementación. Los archivos de implementación (métodos) normalmente poseen la extensión .m.

@implementation classname+classMethod { // implementation}-instanceMethod { // implementation}@end

Los métodos son escritos con sus declaraciones de interfaz. Comparando Objective-C y C:

-(int)method:(int)i { return [self square_root: i];}int function(int i) { return square_root(i);}

La sintaxis admite nombrado de argumentos.

-(int)changeColorToRed:(float)red green:(float)green blue:(float)blue [myColor changeColorToRed:5.0 green:2.0 blue:6.0];

La representación interna de éste método varía entre diferentes implementaciones de Objective-C. Si myColor es de la clase Color, internamente, la instancia del método -changeColorToRed:green:blue: podría ser etiquetada como _i_Color_changeColorToRed_green_blue. La i hace referencia a una instancia de método, acompañado por los nombres de la clase y el método, y los dos puntos son reemplazados por guiones bajos. Como el orden de los parámetros es parte del nombre del método, éste no puede ser cambiado para adaptarse al estilo de codificación.

De todos modos, los nombres internos de las funciones son raramente utilizadas de manera directa, y generalmente los mensajes son convertidos a llamadas de funciones definidas en la librería en tiempo de ejecución de Objective-C – el método que será llamado no es necesariamente conocido en tiempo de vinculación: la clase del receptor (el objeto que envió el mensaje) no necesita conocerlo hasta el tiempo de ejecución.

Page 10: OBJECTIVE C.docx

Tipado dinámico

En Objective-C un objeto puede enviar un mensaje que no está especificado en su interfaz. Esto puede permitir una mayor flexibilidad, ya que permite que un objeto “capture” un mensaje y lo envíe a un objeto diferente que puede responder al mensaje de manera apropiada. Este comportamiento se conoce como el reenvío de mensajes o delegación.

Categorías

Las categorías nos permiten modificar una clase ya existente aunque no dispongamos de su código fuente. La diferencia que hay entre la herencia y la categorización es que la herencia sólo nos permite crear nuevas hojas en la jerarquía de clases, mientras que la categorización nos permite modificar nodos inferiores de la jerarquía de clases.

Entero.h

# import <objc /Object.h>;

@interface Entero : Object { int entero;}

- (int)entero;- (id)entero:(int) param;@end</objc>

Entero.m

# import "Integer.h"

@implementation Integer(int)entero { return integer;}

- (id)entero:(int)param { entero = param; return self;}@end

Entero+Aritmetica.h

Page 11: OBJECTIVE C.docx

# import "Integer.h"

@interface Entero (Aritmetica)- (id)suma:(Entero *)adendo;- (id)resta:(Entero *)sustraendo;@end

Entero+Aritmetica.m

# import "Integer+Aritmetica.h"

@implementation Entero (Aritmetica)- (id)suma:(Entero *)adendo { return [self entero: [self entero] + [adendo entero]];}

- (id)resta:(Entero *)sustraendo { return [self entero: [self entero] - [sustraendo entero]];}@end

Encapsulación

Para declarar los niveles de encapsulación de las variables de instancia, se usan las directivas del compilador @public, @protected y @private. Estás directivas del compilador actúan cómo modificadores de acceso, pueden aparecer tantas veces cómo sea necesario, y afectan a todas las variables de instancia desde su aparición, hasta el nuevo modificador de acceso. Si no existe modificador de acceso, por defecto las variables de instancia son @protected. Los efectos de los modificadores de acceso son los siguientes:

Cuando una variable de instancia tiene el modificador de acceso @public, la variable de instancia es accesible desde cualquier parte del programa.

Cuando una variable de instancia tiene el modificador de acceso @private, entonces si se accede a la variable de instancia desde dentro del objeto la variable de instancia es visible. En cualquier otro caso no será visible.

Cuando una variable de instancia tiene el modificador de acceso @protected, las reglas de acceso son similares a las de @private excepto que también se permite acceder a la variable de instancia desde una clase derivada.

A diferencia de C o Java, los programadores Objective-C no tienen la costumbre de indicar el ámbito de accesibilidad de las variables de instancia. Sólo en las ocasiones en las que realmente sea importante marcar a una variable cómo pública o privada se usan sus correspondientes directivas del compilador.

Page 12: OBJECTIVE C.docx

En Objective-C podemos acceder a variables de instancias protegidas y privadas de un objeto desde fuera del objeto, pero el compilador generará un warning, avisando de que en el futuro está formado de acceso se considerará un error de compilación.

Una peculiaridad de Objective-C, que no encontramos ni en C ni en Java, es que los modificadores de acceso afectan sólo a las variables de instancia, no a los métodos de la clase. Los métodos en Objective-C pueden ser sólo de dos tipos:

Métodos públicos, si están declarados en la interfaz del objeto. Métodos privados, si están declarados en la implementación del objeto.

Otra peculiaridad de Objective-C es que nos permite llamar a métodos privados (ya sean de clase o de objeto). Durante la compilación se producirá un warning avisando de que el método podría no existir, pero en tiempo de ejecución el método se encuentra y ejecuta correctamente. Aun así, está característica puede cambiar en el futuro, con lo que si vamos a ejecutar un método desde fuera del objeto, debemos declararlo de acceso público.

Por defecto el compilador tomará como protected todas las que no estén afectadas por algún modificador explícitamente.

Para los efectos de este ejemplo aplicaremos estos modificadores de la siguiente manera:

@interface Person : NSObject{ NSString *name; @public NSDate *birthDate; @private float height; @protected float weight;}

Name por defecto es protected.

Herencia

Así como en muchos otros lenguajes, en Objective C es posible trabajar con el concepto de herencia. La herencia define una jerarquía entre diferentes clases. Una clase que esté por encima de toda la jerarquía puede ser definida como una “root class” o clase principal. En lenguajes como Java dicha clase es la conocida Object, de la cual todas las clases definidas en Java siempre heredarán. En el caso de Objective C, la

Page 13: OBJECTIVE C.docx

clase raíz es conocida como NSObject. A partir de esta clase raíz es posible definir otras clases que estén por debajo en el nivel jerárquico, como puede apreciarse en la siguiente definición de clase en Objective C:

Como se puede apreciar, en posible indicar que la clase Fraccion (definida por nosotros) “hereda” de la clase NSObject. A diferencia de lenguajes como Java en donde esta relación no se especifica directamente, en Objective C sí debe hacerse. Ahora bien, ¿Qué es formalmente la herencia?. Veamos:

“En orientación a objetos la herencia es el mecanismo fundamental para implementar la reutilización y extensibilidad del software. A través de ella los diseñadores pueden construir nuevas clases partiendo de una jerarquía de clases ya existente (comprobadas y verificadas) evitando con ello el rediseño, la remodificación y verificación de la parte ya implementada. La herencia facilita la creación de objetos a partir de otros ya existentes, obteniendo características (métodos y atributos) similares a los ya existentes.

Es la relación entre una clase general y otra clase más específica. Por ejemplo: Si declaramos una clase párrafo derivada de una clase texto, todos los métodos y variables asociadas con la clase texto, son automáticamente heredados por la subclase párrafo.

La herencia es uno de los mecanismos de la programación orientada a objetos, por medio del cual una clase se deriva de otra, llamada entonces superclase, de manera que extiende su funcionalidad. Una de sus funciones más importantes es la de proveer Polimorfismo y late binding” [2].

Ahora veamos un ejemplo sencillo en Objective C para ilustrar este concepto:

En este caso se hace una definición muy sencilla de una clase llamada “ClaseA” que hereda de NSObject y que sólo define un atributo entero. Adicionalmente se define el @property para el atributo (recordar que esto se hace para indicarle a Objective C que genere la definición del get y set del atributo) y también se define un método llamado inicializarVar que no recibe nada como parámetro y devuelve void. La implementación de la clase puede verse en su archivo .m respectivo:

Page 14: OBJECTIVE C.docx

Aquí puede apreciarse la implementación de “ClaseA”. Es importante recordar que el @synthesize es que el que permite junto con el @property indicarle a Objective C que genere la definición del get y set del atributo. Adicionalmente podemos apreciar la implementación del método respectivo. Ahora veamos que ocurre con otra clase que pudiera heredar de ClaseA:

En este caso la clase “ClaseB” no hereda de NSObject, sino que lo hace de “ClaseA”. En este caso “ClaseB” tiene la implementación de un método llamada imprimiVar, que no recibe parámetros y devuelve void. Veamos ahora la implementación de esta interfaz en el archivo .m respectivo:

La implementación de la clase B imprime simplemente el valor de la variable x por el terminal. Pero, ¿De dónde proviene la variable x si ésta no está definida en el interface de ClaseB?. En este caso el atributo es “heredado” de la clase “ClaseA”, al igual que el método inicializarVar, que inicializa el valor de x en 100.

De este pequeño ejemplo es posible extraer ciertos puntos de alta importancia:

En Objective C, al igual que en Java, la herencia es simple (una clase SÓLO puede heredar de otra, no hay herencia múltiple)

Al igual que en Java, en Objective C es posible heredar atributos y métodos

Clases Abstractas

En Objective (al igual que en lenguajes como Java o C++) es posible definir clases abstractas. Recordemos que una clase abstracta es aquella donde es posible tener

Page 15: OBJECTIVE C.docx

implementación de métodos y también prototipos de métodos, que deberán ser implementados por aquellas clases que “implementen” o hagan el implements (Java) de la clase abstracta. Por lo general las clases abstractas se utilizan para definir clases con comportamientos comunes e implementar en cada clase aquellos comportamientos distintos entre sí.

¿Cómo definir una clase abstracta en Objective C?

Ejemplo:

En este caso tenemos la misma clase “ClaseA” del ejemplo anterior, pero en este caso se hace uso de una etiqueta adicional, llamada @protocol. Es decir, estamos definiendo lo que en Objective C se conoce como “protocolo”. El protocolo puede ser visto como un contrato entre esta clase y cualquier otra clase que herede de ella (siempre y cuando la clase hija acepte el contrato).

Dentro de este protocolo tenemos dos métodos, uno llamado metodoAbstracto y otro llamado metodoAbstractoDos.

Ahora analicemos nuestra clase claseB:

Se puede obserar que la clase “ClaseB” sigue heredando de “ClaseA” pero con una salvedad. Ahora se deja especificado que adicionalmente a heredar, “ClaseA” está aceptando el protocolo (contrato) de “ClaseA”, con lo cual ahora “ClaseB” estará obligada a implementar todos y cada uno de los métodos contenidos en el protocolo. Para aquellos desarrolladores que trabajan con lenguajes como Java pudieran encontrar una similitud (de concepto, no de implementación) entre dicho lenguaje y Objective C.

Page 16: OBJECTIVE C.docx

Constructores convenientes (metodos factory)

Un constructor conveniente o metodo factory es un método de clase que devuelve un objeto (una instancia) de esa clase. Es una forma conveniente de crear un objeto, puesto que no tenemos que preocuparnos por la administración de la memoria que este utiliza. Sin embargo, un objeto creado mediante un constructor conveniente, solamente tiene una existencia temporal. Generalmente, el tiempo durante el cual se ejecuta el bloque de código donde este se creó. Por esto se dice que son objetos auto liberado. En algunos casos puede ser necesario retener un objeto creado a partir de un constructor conveniente. Es decir, hacer que el objeto exista durante un mayor tiempo. Un ejemplo de esto lo veremos m as adelante. Los nombres de los métodos ́� que corresponden a constructores convenientes, usualmente comienzan con el nombre de la clase (sin el prefijo NS o GS). Solamente las clases no visuales poseen constructores convenientes. Ya que no tiene sentido que un objeto visual exista por un breve tiempo. Un ejemplo de como crear un objeto mediante un constructor conveniente es el siguiente:

NSArray *lista = [NSArray arrayWithObjects: @"Uno",@"Dos",@"Tres",@"Cuatro",nil];

Un array es una lista de objetos. En este caso, hemos creado una lista que contiene las cadenas de texto Uno, Dos, Tres y Cuatro. Solamente indica el final de la lista y no se incluye en esta. Este array creado de esta forma es autoliberado y no debemos preocuparnos por la administración de la memoria que este utiliza.