Advertisement
  1. Code
  2. iOS SDK

Aprende Objective-C: Día 4

Scroll to top
Read Time: 12 min
This post is part of a series called Learn Objective-C.
Learn Objective-C: Day 3
Learn Objective-C: Day 5

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Bienvenido a la cuarta parte de esta serie sobre Objective-C. Hasta ahora, hemos analizado mucho la teoría y los principios y la funcionalidad del lenguaje para tener una buena idea de cómo funciona. Hoy, haremos una clase simple similar al ejemplo del automóvil que vimos en partes anteriores de esta serie. Nuestra clase tomará los detalles de un automóvil, lo que nos permitirá obtener y establecer los valores retenidos. Después del ejemplo de hoy, deberías poder crear tus propias clases en Xcode y jugar con ellas.

Hasta el momento, hemos recibido excelentes comentarios por correo electrónico, Twitter y comentarios. Es grandioso ver a tantas personas interesadas en este tema y es aún mejor ver que muchos de ustedes lo están probando y formulando grandes preguntas. ¡Seguid así!

Empezando

Comience iniciando Xcode y creando un nuevo proyecto. En el separador de Mac OS X, haga clic en Aplicación, luego haga clic en Herramienta de línea de comandos. Finalmente, cambie el cuadro desplegable para establecer el tipo a Foundation.

Xcode New ProjectXcode New ProjectXcode New Project

Guarde el proyecto como desee, llamé a CarApp. Una vez que aparece la ventana del proyecto, necesitamos crear una nueva clase. Pulse Comando-N (o Archivo > Nuevo archivo), navegue a Clase Cocoa en Mac OS X y seleccione Clase Objective-C. Asegúrese de que la Subclase de esté configurada en NSObject y presione Siguiente. Denomine a su clase SimpleCar y asegúrese de que se creará un archivo .h, luego guárdelo.

Nuestra clase ahora existe, pero no hace nada. Cambiemos eso dándole un código. Recuerde que en Objective-C dividimos nuestro código en dos partes: interfaz e implementación. Tiene sentido lógico trabajar primero en la interfaz, así que ahí es donde comenzaremos.

Codificando la interfaz

Abra el archivo SimpleCar.h y en su estado actual debería verse así (he omitido el encabezado del comentario a continuación)

En primer lugar, estamos incluyendo Cocoa.h, que nos da acceso a cosas como NSString, NSMutableString, etc. Luego, creamos nuestra clase (SimpleCar) como una subclase de NSObject.

Ahora tenemos que decidir qué información debe almacenar nuestra clase. Como usamos un automóvil como ejemplo, necesitamos almacenar información relacionada con el automóvil, como por ejemplo:

  • Make
  • Modelo
  • VIN

Hay mucho más que podríamos entrar, pero por ahora eso servirá. Para cada una de estas propiedades, debemos almacenarlas en una variable adecuada para ese tipo de datos. La marca y el modelo serán un rango de caracteres (como texto, número y posiblemente puntuación) por lo que tiene sentido usar una cadena. El VIN (número de identificación del vehículo) solo será un número, así que eso es lo que usaremos. Nuestro código ahora se ve así (encabezado omitido):

Anteriormente dijimos que para obtener o establecer datos de una clase, se debe usar un método. Entonces, para establecer las variables, necesitamos agregar métodos. Para hacer esto, haremos cuatro: una establecerá la marca, una el modelo, una el VIN, y un método final establecerá tanto la marca como el modelo (solo para mostrarle cómo usar múltiples argumentos).

Declaramos los métodos después del corchete y antes de @end. Al colocar un guion (signo menos) antes del método, le decimos al compilador que estamos a punto de declarar un método de instancia. Un método de instancia es un método ejecutado en nuestra instancia. Por el contrario, un signo más indica que el método que se invoca es un método de clase que no necesita una instancia de objeto individual para ejecutar -más adelante.

Nuestro primer método devuelve nulo, se llama setVin y toma un NSNumber como argumento. Nuestro segundo método es similar, devuelve vacío, se llama setMake y toma un NSString como argumento. El tercero es el mismo, con un nombre diferente.

Nuestro método final también devuelve vacío pero toma dos parámetros: newMake y newModel, ambos deben ser NSString. La denominación utilizada en este método es similar a la forma en que se nombran la mayoría de los métodos de Objective-C: en inglés sencillo. Entonces, cuando lea el método permitido, es obvio que el método será "Establecer marca y modelo". Es importante recordar que el nombre del método en este caso es 'setMake:andModel:' - todos los títulos de los argumentos están incluidos en el nombre del método.

Una nota importante es que usamos (void) porque nuestros métodos no necesitan devolver nada. Como todo lo que hacen es establecer datos y no necesitan devolver nada (como un mensaje de éxito), simplemente utilizamos void.

A continuación, agregaremos los métodos que usaremos para obtener los valores. Aunque llamamos a nuestros métodos get y set methods, usualmente usamos "set" en el título y omite "get". La forma en que nombra sus métodos depende de usted, pero dejar caer "obtener" es común y ayuda a evitar confusiones.

Nuestro nuevo conjunto de métodos se ve así:

Observe que los métodos get usan los mismos nombres que las variables de la clase. Esto hará que sea sencillo cuando buscamos las variables. Será como si estuviéramos accediendo a las variables directamente, haciendo que los métodos get aparezcan transparentes.

Codificando la implementación

Entonces, ahora que la interfaz está en su lugar y sabemos qué hará la clase, debemos implementar nuestros métodos. Mirando hacia atrás, tenemos cuatro métodos que debemos implementar: setVin, setMake, setModel y setMake:andModel. Antes de mover archivos, copie las declaraciones de métodos en su portapapeles (Cmd + C). Ahora cierre SimpleCar.h y ejecute SimpleCar.m en el editor, pegando las declaraciones de los métodos entre @implementation y @end, así:

Obviamente, esto no está bien, así que lo que tenemos que hacer es cambiar los puntos y comas por llaves, donde funcionará el funcionamiento interno del método, así:

Ahora tenemos que darles a nuestros métodos algún código. Comencemos con los métodos getter ya que son bastante simples. Para cada método getter, todo lo que tenemos que hacer es asegurarnos de que la función devuelve lo que se pretende devolver. Por esta razón, nuestros métodos getter se ven así:

Recuerde: los métodos están devolviendo las variables que definimos en el archivo de interfaz. No te confundas entre los nombres de los métodos y los nombres de las variables.

Eso es bastante sencillo, cuando llamamos make (por ejemplo), luego devuelve el puntero a un NSString, en este caso a la variable make. Lo mismo ocurre con el modelo y vin (excepto que, por supuesto, vin devuelve un número).

Ahora para los métodos setter, primero miraremos el código y luego lo revisaremos luego. Nuestros métodos setter se ven así:

Los métodos establecidos son un poco más complicados que nuestros métodos get. Queremos asignar los valores que se pasan a cada método para que sean propiedad de la clase. Primero lanzamos estas variables en caso de que ya estén asignadas. Si no están asignados, entonces son nulos, y ningún objeto ignora los mensajes que se les pasan. Cubriremos más estos problemas cuando analicemos la gestión de la memoria.

Debido a que en realidad asignamos memoria para nuestros objetos en los métodos setter, debemos asegurarnos de liberarlos cuando el objeto se libera de la memoria. Para hacer esto, necesitamos agregar un método dealloc personalizado, así:

Probando la clase

¡Felicitaciones! Si siguió todo lo anterior, entonces debería tener una clase trabajadora (si no, descargue los archivos fuente disponibles con este artículo). Entonces, probemoslo.

Abra el archivo principal de su proyecto (el mío se llama CarApp.m), que de manera predeterminada debería tener el siguiente aspecto:

Elimine el comentario y la línea NSLog ya que no los necesitaremos ahora.

Para comenzar a usar nuestra clase, debemos incorporarla al programa. Debajo de la línea # import original, agregue la siguiente línea:

Nuestra clase ahora está disponible para su uso, pero necesitamos crear una instancia para probarla. Aquí está el código usado en total:

En primer lugar creamos un puntero a una instancia de SimpleCar llamada myCar. A continuación, usamos alloc e init; estos se analizarán más adelante.

Luego, dado que necesitamos pasar un NSNumber al método setVin, hacemos uno aquí. De nuevo, creamos un puntero a una instancia de NSNumber llamada newVin y lo iniciamos con el valor entero de 123. La constante '123' es un entero, por lo que usamos numberWithInt.

A continuación, invocamos nuestros métodos, en primer lugar ponemos quién debe recibir el mensaje (myCar) y luego usamos el método setVin. Después de los dos puntos es el valor que estamos suministrando al método que es el NSNumber que creamos antes. A continuación hacemos lo mismo, pero llamamos al método setMake con dos parámetros. La razón por la que estos parámetros están precedidos por un signo @ es para decirle al compilador que lo siguiente es una cadena.

Finalmente, lanzamos myCar cuando ya terminamos, más sobre esto más adelante en la serie bajo gestión de memoria.

Nuestra clase ahora está funcionando, y para ver la prueba, agregamos algunas declaraciones NSLog para imprimir los valores a la consola. Si abre la consola (Ejecutar > Consola) y luego crea y ejecuta su aplicación, debería ver un resultado similar al siguiente:

DebuggerDebuggerDebugger

Propiedad y Sintetizar

Si nos fijamos en el código anterior, muchas cosas parecen bastante inútiles y excesivas. Por ejemplo, en nuestros métodos getter todo lo que estamos haciendo es devolver una variable de instancia, pero esto ocupa tres líneas de código para hacer algo simple. Además, en nuestros métodos setter, solo estamos estableciendo variables de instancia; básicamente, todos nuestros métodos, excepto nuestro método que toma dos argumentos, parecen inflados y en el camino. Objective-C resuelve esto con @property y @synthesize, que reemplazan nuestros métodos de acceso y hacen una codificación mucho más ordenada.

Este es el aspecto que tiene nuestro nuevo archivo de interfaz al usar propiedades:

Wow, eso es mucho más corto. Entonces, ¿qué está pasando con las declaraciones @property? Primero le decimos al compilador que estamos declarando una propiedad usando @property, luego seguimos con los atributos para esta propiedad. Los atributos son el estado de lectura / escritura de una propiedad y cierta gestión de la memoria. Hemos utilizado readwrite para todos, lo que significa que los métodos getter y setter se crean dinámicamente para nuestras variables de instancia (podríamos usar writeonly o readonly solo para una u otra). La razón por la que utilizamos retener se aclarará la próxima vez cuando cubramos la administración de la memoria.

Antes de que esto pueda funcionar, necesitamos implementarlo en nuestro archivo de implementación, lo hacemos usando @synthesize. Nuestro nuevo archivo de implementación se ve así:

¿No se ve mejor? Piénselo de esta manera, @property reemplaza todas las declaraciones de métodos de interfaz para getters y setters, y @synthesize reemplaza los métodos reales. Los getters y setters ahora se crean dinámicamente y no necesitamos perder tiempo creándolos a menos que necesitemos hacer algo realmente especial.

Concluyendo

Ahora debería tener un control firme de clases, objetos e instancias. Claro, no estás creando clases que cambiarán el mundo todavía, pero esto lleva tiempo. Es mejor aprender con el ejemplo, así que si no está codificando a medida que avanza, asegúrese de descargar los archivos fuente y leer (y compilar) para asegurarse de estar al 100% en lo que está sucediendo.

La próxima vez

Hemos mencionado mucho la gestión de la memoria en este tutorial, es un tema muy importante que debe abordarse (juego de palabras), por lo que nos adentraremos en él la próxima vez. Es cierto que no es el tema más divertido o el más fácil de aceptar, pero es absolutamente crucial si quieres convertirte en un hábil programador de Objective-C.

Reto

El desafío de esta semana puede ser un poco complicado, pero ya veremos cómo te va. En primer lugar, si no ha copiado todo el código anterior, descargue los archivos fuente que se incluyen con este artículo. El desafío es agregar otra clase al proyecto, pero esta vez debe ser una subclase de SimpleCar (recuerde, definimos la clase padre en el archivo de interfaz). Si puede hacerlo, juegue y use los métodos heredados e intente agregar los suyos propios para cosas tales como: tamaño del motor, puertas o altura.

Recuerde: si tiene alguna pregunta o consulta, suelte un comentario a continuación o escríbame un mensaje en Twitter. La única pregunta estúpida es la que no hiciste: ¡esta serie trata de aprender, así que no dudes en preguntarnos!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.