miércoles, 15 de febrero de 2012

Categorías, Protocolos y Delegados

Estas tres "funcionalidades" porque la verdad no sé cómo llamarlas, son parte esencial de Objective-C, ya que cada una presenta su nivel de utilidad. Empecemos con lo básico, Categorías.


Categorías

Las categorías no son otra cosa más que la extensión de funcionalidad de las clases sin necesidad de hacer subclassing; por ejemplo pensemos en algún método que no esté por default en una clase y que consideres necesario para todas tus clases en tu proyecto, una cadena invertida en NSString por decirlo. Es una definición muy sencilla ya que implementar una categoría es así de sencillo. Un ejemplo de esto se muestra a continuación:


/* Archivo NSStringUtilities.h */

#import

@interface NSString (NSStringUtilities)

+ (NSString *)revertString:(NSString *)string;

@end

/* Archivo NSStringUtilities.m */

#import "NSStringUtilities.h"

@implementation NSString (NSStringUtilities)

+ (NSString *)revertString:(NSString *)string {

//Implementación del código para invertir la cadena

return cadenaInvertida;

}

@end

De esta forma, importando nuestro archivo NSStringUtilities.h a las clases que necesitemos, podremos acceder al método de clase de NSString para revertir una cadena.


Protocolos

Protocols declare methods that can be implemented by any class. Protocols are useful in at least three situations:

  • To declare methods that others are expected to implement
  • To declare the interface to an object while concealing its class
  • To capture similarities among classes that are not hierarchically related [1]

Como Apple lo dice, los protocolos son métodos que pueden ser implementados por cualquier clase y son útiles para declarar métodos que se espera que otras clases implementen, para declarar una interfaz a un objeto mientras se esconde su clase y para capturar similitudes entre clases que no están jerárquicamente relacionadas.

Los protocolos pueden ser formales e informales; los formales están dentro de la directiva @protocol , declaración de métodos y @end, además de poder incluir las directivas @required y @optional para indicar métodos obligatorios y opcionales respectivamente (en caso de no definir ninguna de las anteriores, los métodos serán opcionales); y los informales son declarados como categorías generalmente de NSObject ya que todas las clases heredan de esta y no están restringidos a ser parte de una jerarquía.

Todo esto de la teoría puede no sonar muy claro que digamos pero aplicándolo a la práctica todo es más sencillo. Un ejemplo claro de los protocolos son las tablas (UITableView) ya que los métodos que implementamos para configurar y llenar la tabla son parte del protocolo UITableViewDataSource[2]. Como la documentación indica, tenemos muchos métodos para llenarla, estos son:

  • – tableView:cellForRowAtIndexPath: required method
  • – numberOfSectionsInTableView:
  • – tableView:numberOfRowsInSection: required method
  • – sectionIndexTitlesForTableView:
  • – tableView:sectionForSectionIndexTitle:atIndex:
  • – tableView:titleForHeaderInSection:
  • – tableView:titleForFooterInSection:

Y como claramente lo indica, hay dos métodos obligatorios si deseamos implementar este protocolo que son tableView:cellForRowAtIndexPath: que sirve para regresar la celda que estará en cierta posición en la tabla y tableView:numberOfRowsInSection: que define el número de celdas en la sección. Los demás métodos por ser opcionales, regresarán un valor por default (por ejemplo numberOfSectionsInTableView: que regresa 1 en caso de no implementarlo).


Delegados

Los delegados o delegación es un patrón donde un objeto actúa por cuenta de o en coordinación con otro objeto. El objeto delegante mantiene una referencia al otro objeto (el delegado) y en el momento apropiado le envía un mensaje. El mensaje informa al delegado de un evento que el objeto delegante va a manejar o ya manejó. El delegado debe responder al mensaje actualizando la apariencia, su estado u otros objetos de la aplicación, y en algunos casos puede regresar un valor que afecta como el próximo evento es manejado. El valor principal de la delegación es permitir la simple personalización del comportamiento de ciertos objetos en un objeto central. [3]

La breve explicación de Apple acerca de este patrón es todo lo que necesitan saber; un objeto (delegado) le notifica a otro (delegante) acerca de cierto evento del que está interesado. Debido a que MVC (Modelo Vista Controlador) nos dice que siempre debemos separar la vista del modelo y sólo el controlador puede acceder a este, los delegados ayudan a respetar este enfoque.


Ejemplo

En el siguiente ejemplo se verán los temas anteriores para su mejor comprensión.

Free Image Hosting at www.ImageShack.us

Primero creamos un proyecto de tipo Simple View Application ya que es todo lo que necesitaremos para este ejemplo.

Free Image Hosting at www.ImageShack.us

Le damos el nombre que queramos en "Product Name" al igual que en "Company Identifier" (por el momento ya que es sólo un ejemplo aunque si desean pueden usar el que deseen), "Device Family" iPhone y todo lo demás lo deseleccionamos ya que no lo usaremos.

Free Image Hosting at www.ImageShack.us

Con nuestra estructura creada, damos click derecho sobre algún archivo y seleccionamos la opción de "New File ..." para crear nuestro archivo de categoría.

Free Image Hosting at www.ImageShack.us

En el siguiente asistente seleccionamos la opción de "Objective-C category" y seleccionamos "Next"

Free Image Hosting at www.ImageShack.us

Después nombramos nuestra categoría como queramos y le decimos que esta categoría será de NSString (por default aparece NSObject).

Free Image Hosting at www.ImageShack.us

Después veremos como queda la estructura del proyecto con el nuevo archivo.

Free Image Hosting at www.ImageShack.us

Sobre NSString+NSStringUtilities.h, declararemos un método de clase que será +(NSString*)revertString:(NSString*)string; el cual nos servirá para revertir una cadena.

A continuación, en el archivo .m declararemos la funcionalidad de nuestro método mostrado.

Free Image Hosting at www.ImageShack.us

Free Image Hosting at www.ImageShack.us

En seguida, iremos al archivo "ViewController.xib" que abrirá una ventana como la siguiente. En esta, a la derecha abajo, encontraremos un conjunto de componentes gráficos para nuestra vista y busquemos el "Table View" y arrastrémoslo a la vista.

Free Image Hosting at www.ImageShack.us

Después con la tecla ctrl seleccionando el componente de Table View, arrastramos el indicador azul que saldrá hacia el "File's Owner" (que en este caso es nuestro ViewController) para que nos aparezcan dos opciones como las mostradas arriba.

Free Image Hosting at www.ImageShack.us

Seleccionaremos ambas opciones (delegate y dataSource), esta es la forma visual de asignar el delegado y el dataSource de un componente a otro.

Free Image Hosting at www.ImageShack.us

Después en nuestro archivo ViewController.h, junto a la declaración de la interfaz, dentro de angle brackets o < > se colocan todos los protocolos al que el controlador se suscribirá y se separan por comas como se muestra. En nuestro caso implementaremos los protocolos de UITableViewDelegate y UITableViewDataSource. UITableViewDataSource se refiere a la forma en que se llena la tabla, número de celdas, número de secciones, celdas para cada sección, tamaño de celdas, etc. y el UITableViewDelegate se refiere a qué acciones ejecutaremos cuando seleccionen una celda, etc.

Free Image Hosting at www.ImageShack.us

Si hacemos Build (cmd+B) a nuestro código, nos encontraremos con varios warnings en nuestro proyecto los cuales son referentes a métodos de protocolo no implementados, esto es, nuestro controlador está suscrito a ciertos protocolos con métodos requeridos los cuales no implementamos. Siendo esto, los métodos requeridos de este protocolo son tableView:numberOfRowsInSection: y tableView:cellForRowAtIndexPath:

Free Image Hosting at www.ImageShack.us

Primero implementamos el tableView:numberOfRowsInSection: que simplemente para este ejemplo sencillo regresamos 10 celdas y como el código de cellForRowAtIndexPath es un poco más "complicado" usaremos el poder de Xcode para generar el código con un snippet de código que nos provee para esto. En la barra de lado derecho (cmd+alt+0) encontraremos una pestaña con llaves ({ }) la cual tiene snippets de código. Buscamos la de "Reusable TableView Cell" y la arrastramos a nuestro código para obtener algo así:

Free Image Hosting at www.ImageShack.us

Así es más fácil de implementar este código que memorizando las líneas.

Free Image Hosting at www.ImageShack.us

Entonces reemplazaremos las partes de código a algo como lo mostrado aquí. La variable "cellIdentifier" declara el identificador de celda que usará la tabla para reusar celdas (la reutilización de celdas es una de las características más poderosas de las tablas en iOS), por lo que, cuando la tabla vaya a reutilizar una celda, primero pregunta si hay alguna con ese idenfiticador de celda para reutilizarla, si la encuentra la reusa y no crea una nueva, sino debe crearla. Todo esto es automático y no debemos preocuparnos de ello; claro en caso de tener muchos tipos de celdas, esto puede complicarse un poco. Por el momento en este ejemplo, como todas las celdas son creadas con el identificador "MyIdentifier", siempre que necesite celdas, tomará las existentes con este identificador para reusarlas. En seguida, accedemos a la propiedad textLabel de la celda para ingresar un texto que en este caso es un string con la combinación de la palabra "Cell" con el número de la celda, indicado por indexPath.row.

Free Image Hosting at www.ImageShack.us

Ahora, si compilamos nuestro código, observaremos que ya no tenemos warnings ya que hemos implementado los métodos requeridos del protocolo de UITableViewDataSource.

La salida del simulador será algo así:

Free Image Hosting at www.ImageShack.us

Si deseamos ver la propiedad de la reutilización de las celdas, podemos poner un breakpoint en el código haciendo click sobre el número de línea dentro del snippet de tableView:cellForRowAtIndexPath:, ahora en el simulador scrolleemos en alguna dirección donde alguna de las celdas de la tabla salga de la vista y observaremos como el Xcode se detiene en el método antes de regresar la tabla al mostrar la celda. Entonces en la comparación de "if (cell==nil)" veremos que salta esta condición ya que el método de "dequeueReusableCellWithIdentifier:" regresó una celda válida para el identifier indicado y no debemos crear una nueva.

Para demostrar el uso de la categoría, trataremos de usar el método de reverseString: que declaramos anteriormente, aunque nos encontraremos con lo siguiente:

Free Image Hosting at www.ImageShack.us

Esto es porque no hemos importado nuestro archivo de utilidades de NSString, para ello lo importaremos de la siguiente forma:

Free Image Hosting at www.ImageShack.us

Por lo cual, ahora accediendo de la misma forma al método "reverseString:" veremos que el autocompletar ha encontrado el método para poder implementarlo.

Free Image Hosting at www.ImageShack.us

Cuando hayamos cambiado esta parte a que la celda muestre el texto revertido, tendremos la siguiente salida del simulador:

Free Image Hosting at www.ImageShack.us

Para darle un poco más de "emoción" a esto, implementaremos un método del delegado de UITableViewDelegate para saber qué celda hemos seleccionado. Iniciamos nuestro método con -(void) y accedemos al autocompletar para que nos muestre las siguientes opciones de las cuales seleccionaremos tableView:didSelectRowAtIndexPath:

Free Image Hosting at www.ImageShack.us

Este método nos envía el indexPath de la celda que fue seleccionada (el indexPath está conformado por la sección y la celda en esa sección), entonces podemos usar el índice de la celda para desplegar un mensaje de la siguiente forma:

Free Image Hosting at www.ImageShack.us

Y la salida del simulador debe ser algo así:

Free Image Hosting at www.ImageShack.us

¿Esto ha sido sencillo no? Démosle un poco más de toque!

Agregaremos un nuevo archivo de la siguiente forma:

Free Image Hosting at www.ImageShack.us

Una clase de Objective-C llamada TableViewHeader que a su vez será subclase de UIView.

Free Image Hosting at www.ImageShack.us

Sobre este archivo, crearemos nuestro protocolo de la siguiente forma, tendremos una property delegate que será la encargada de notificar al delegante de los métodos del protocolo, además de declarar un método IBAction el cual se llamará al presionar un botón y lo que se planea es que el protocolo le avise al delegante cuando el botón haya sido presionado.

Free Image Hosting at www.ImageShack.us

En nuestro archivo .m declararemos todo esto de la siguiente forma:

Free Image Hosting at www.ImageShack.us

Las validaciones de "conformsToProtocol:" y "respondsToSelector:" son necesarias, ya que en algún momento puede ser que el delegate tenga un valor no válido y si llamamos al selecctor del protocolo de forma "insegura" nuestra app pueda crashear.

Después de esto, crearemos un nuevo archivo pero ahora de tipo "User Interface" y será "Empty" donde tendremos nuestra vista y nuestro botón para ligar el método declarado.

Free Image Hosting at www.ImageShack.us

Llamaremos a nuestro archivo TableViewHeader (de la misma forma que las subclases de UIView) para poder identificarlo como el archivo de interfaz de nuestra subclase de UIView.

Free Image Hosting at www.ImageShack.us

Ahora, abriremos el archivo de TableViewHeader.xib para agregar componentes visuales. Observamos que el archivo no tiene nada, nisiquiera una UIView, agreguémosla. De la misma forma en que arrastramos la UITableView anteriormente, hagámoslo con una UIView. Al tener nuestra UIView, nos iremos al panel derecho y sobre la opción mostrada a continuación, diremos que la clase de esta UIView será TableViewHeader.

Free Image Hosting at www.ImageShack.us

Primero, cambiemos el frame de la vista ya que lo usaremos en la tabla de ViewController, démosle 50 de alto (height). De la misma forma que antes, agregamos un botón a la vista y cambiamos su propiedad "Title" y demás que querramos (explora el menú de opciones que tiene el botón :]).

Free Image Hosting at www.ImageShack.us

Después, al igual que antes, seleccionamos el botón y presionando la tecla ctrl arrastraremos ahora hacia la vista TableViewHeader (no hacia el File's Owner ya que nuestro owner o propietario y que contiene el método de IBAction del botón es la clase TableViewHeader de la cuál es parte la vista) y nos aparecerá el método declarado para poder ligarlo.

Lo siguiente que haremos es agregar dicha vista como header de la sección de la tabla, esto es mediante un método del protocolo de UITableViewDataSource el cual es el siguiente:

Free Image Hosting at www.ImageShack.us

La declaración será la siguiente:

Free Image Hosting at www.ImageShack.us

Importaremos el archivo de "TableViewHeader.h" para poder hacer uso de el tanto de la vista como del protocolo.

Free Image Hosting at www.ImageShack.us

Primero obtenemos el bundle de la aplicación con [NSBundle mainBundle], cargamos el nib con loadNibNamed:owner:options: que nos regresa un array con los outlets del nib y usamos lastObject para obtener el último objeto de los outlets que en nuestro caso es sólo la vista. Setteamos el delegado de esta clase a "self" ("Me" en VB y "This" en Java) para que nos avise de los métodos de la clase a nosotros mediante los métodos declarados en el protocolo. Y al final setteamos la sección al NSInteger que declaramos en la clase y regresamos la vista del header a la tabla.

Ahora, sobre los protocolos declarados en ViewController.h, podemos acceder a TableViewHeaderDelegate el cual debemos incorporar para poder "suscribirnos" a los métodos.

Free Image Hosting at www.ImageShack.us

Al haber hecho esto, ya podemos declarar el método del protocolo para poder hacer lo que queramos cuando se haga tap sobre el botón del TableViewHeader.

Free Image Hosting at www.ImageShack.us

Para la implementación haremos lo siguiente:

Free Image Hosting at www.ImageShack.us

Mandaremos en un mensaje la sección de donde viene el tap del botón.

La salida del simulador será así:

Free Image Hosting at www.ImageShack.us

Esto puede parecer "truqueado" ya que sólo hay una sección en la tabla y siempre nos dirá que estamos presionando el botón sobre la sección cero. Entonces implementemos un método más del UITableViewDataSource de la siguiente forma:

Free Image Hosting at www.ImageShack.us

numberOfSectionsInTableView: como su nombre lo indica, indica el número de secciones que tendrá nuestra tabla, y como el método de tableView:viewForHeaderInSection: siempre regresa la misma vista, cada sección tendrá su vista con su botón pero al presionarlo nos dará una salida diferente, algo así:

Free Image Hosting at www.ImageShack.us

Pueden experimentar con los números de celdas y secciones de la tabla para que vean que sucede ...


Como observamos, aunque la vista del header de la tabla aparece sobre el controlador, es importante saber que NUNCA debemos mezclar datos con vistas, en este caso, hacer que la clase TableHeaderView por ejemplo guarde registros cuando es tappeado en cierta sección de la tabla, todo eso es responsabilidad del controlador de manejar la lógica de lo que se hará, como puede ser guardar información, cambiar la apariencia de la tabla etc. Todo esto es parte del patrón MVC (Model-View-Controller). Una mejor explicación por Apple de esto en un video pueden encontrarlo aquí.


Para descargar el código fuente de la aplicación haz clic aquí.


[1] Protocols (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html)

[2] UITableViewDataSource Protocol (https://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDataSource_Protocol/Reference/Reference.html)

[3] Delegation (https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html)

martes, 31 de enero de 2012

Cuidado! Nueva forma

Esta entrada no tiene nada que ver con iOS pero se me hizo importante mencionarlo.

El día de hoy recibí un correo muy sospechoso, en el cuál se me "ofrecía" un empleo de "Supervisor de Operaciones" según en Gamesa, queriendo aprovechar mi "necesidad" de un empleo la cual no existe porque pues si tengo trabajo :) Bueno esto va para la demás gente que si podría estar en esta necesidad buscando un empleo sin éxito, así que cuidado con este tipo de cosas ... El correo fue el siguiente:

Gamesa Corporativo, S.A. de C.V.

Oferta de Empleo

31 de enero de 2012 09:27a.m.

Buen día.


El perfil que describe en su CV es adecuado para la vacante "Supervisor de Operaciones" que oferta un sueldo neto mensual de $17,000 + PSL, por lo que le solicitamos atentamente presentar los exámenes médicos correspondientes para cubrir la plaza disponible en su lugar de residencia.

Debido a que hemos recibido candidatos de diferentes regiones de la zona, y de los cuales lo hemos seleccionado, la empresa contratante nos requiere su ingreso de manera urgente, por lo que sólo esta ocasión la prueba tiene un costo mínimo que debe ser cubierto por usted yel mismo se reembolsa en su primer quincena laboral.

El procedimiento es el siguiente:

1-.Cubrir mediante un depósito bancario la cantidad de $400 (Cuatrocientos pesos 00/100 MN.) que ampara los gastos médicos.

Banamex

Número de cuenta: 7003-6499905

Lic. González Hernández y/o Gamesa Corporativo, S.A. de C.V.

Departamento de Selección.

2.- Enviar por este medio una imagen legible de su comprobante de depósito indicando en el mismo la fecha, su nombre y sucursal donde lo realizó, todo ésto bajo el titulo de "Ficha de depósito"

3.-.Después del envío de su comprobante recibirá al día siguiente instrucciones anexas de dónde deberá presentarse en su lugar de residencia para dichas pruebas médicas; así mismo le enviaremos 2 evaluaciones que responderá y reenviará vía electrónica, esto para cumplir con el mecanismo de contratación y que no lo altera.

4.- Contará con 1 día hábil máximo para resolver y enviar la hoja de respuestas contestada bajo el titulo de "Resultado PRUEBAS."

5.- Le daremos respuesta con los comentarios correspondientes. Después de los resultados concertaremos la cita para la entrevista en la ciudad de su residencia.

Debido a la coordinación que este tipo de evaluación requiere, sólo contamos hasta el día jueves 2 de febrero para recibir su comprobante, en caso de NO recibir correo alguno entenderemos que espera otra oportunidad. Nuestro proceso es transparente y puede corroborar nuestra legalidad con nuestra cédula empresarial al calce.


Gamesa Corporativo, S.A. de C.V. GCO 901207 A5G

Lic. Laura Ascencio Velázquez

Reclutamiento y selección

jueves, 26 de enero de 2012

Objective-C

Primero que nada, este blog estará dedicado a tutoriales y demás cosas que se me ocurran que se puedan enseñar acerca de este lenguaje (Objective-C). Empezaré con una breve introducción del lenguaje y algunas características del mismo (espero la lectura sea de su agrado).

"The Objective-C language is a simple computer language designed to enable sophisticated object-oriented programming. Objective-C is defined as a small but powerful set of extensions to the standard ANSI C language. Its additions to C are mostly based on Smalltalk, one of the first object-oriented programming languages. Objective-C is designed to give C full object-oriented programming capabilities, and to do so in a simple and straightforward way." [1]

Como podemos leer, Objective-C es un lenguaje simple y sofisticado orientado a objetos. Define un conjunto de pequeñas pero poderosas extensiones de ANSI C, pero además de esto, se basa también en Smalltalk, el cuál fue uno de los primeros lenguajes de programación orientados a objetos. Simplemente, Objective-C está diseñado para dar todas las ventajas de C, orientado a objetos de forma simple y directa.
A pesar de que no se tocará el tema de como funciona el compilador de Objective-C "a bajo nivel", referencio un artículo de Apple por si consideras importante leer a cerca de esto [2].

Bases ...

Primeramente, una breve explicación de los frameworks más usados en Objective-C ya que son sobre los cuales son construídas casi cualquier aplicación:
  • UIKit (User Interface Kit): Como su nombre puede describirlo, es el (kit) encargado de proveer al usuario con componentes gráficos para el desarrollo de una aplicación (labels, tablas, botones, etc) [3].
  • Foundation: Contiene la capa de clases de Objective-C. Estas comienzan con el prefijo NS (de NeXTSTEP, sistema operativo orientado a objetos creado por Next Computer, empresa fundada por Steve Jobs después de ser despedido de Apple en 1985) y son las que manejan datos, por ejemplo NSString para control de cadenas, NSInteger para enteros con signo y así sucesivamente muchas otras clases [4].
Estos dos frameworks son los más básicos e importantes y los que siempre serán añadidos a cualquier tipo de proyecto que crees desde Xcode.

Memoria

Uno de los aspectos MÁS importantes de Objective-C es el manejo manual de la memoria. "¿Qué es esto?" podrías preguntarte … Si vienes de lenguajes como C o C++ puedes estar familiarizado con este conceptos; pero si vienes de Java, C# u otros lenguajes, esto será un nuevo paso para ti. Primero debemos definir los tres tipos de manejo de memoria que "conocemos" en Objective-C:
  • ARC (Automatic Reference Counting): Característica nueva en Objective-C a partir de LLVM 3.0 y iOS 4+ (en realidad fue liberada con iOS 5 pero puedes dar soporte a tus Apps de iOS 4+) la cuál consiste en que el compilador se encarga del ciclo de vida de los objetos según su propio "razonamiento" (esto obvio también dependiendo de cómo el programador maneje el ciclo de vida del objeto a conveniencia) [5].
  • MRC o MMR (Manual Reference Counting o Manual Retain/Release): Tú y SÓLO tú eres el responsable del ciclo de vida de los objetos mediante llamadas "retain" (retener) y "release" (soltar) mediante un mecanismo llamado retain count el cual determina el "tiempo" de vida de un objeto (será explicado más a fondo).
  • Garbage Collection: Tú no tienes ninguna responsabilidad sobre el ciclo de vida de los objetos sino un "collector" (no disponible en iOS, sólo OS X).

Nosotros en lo personal creemos que usar MRC es la forma efectiva ya que el programador debe ser el responsable de la memoria que crea y debe liberar en sus aplicaciones para que estas funcionen de forma óptima. Debido a que este pequeño tutorial es algo demasiado introductivo a Objective-C, dejaremos el manejo de memoria para otro momento ya que se merece su propia página para explicar a fondo muchos conceptos importantes del tema.

Más cosas básicas pero importantes

En Objective-C la forma de crear clases es similar a C++, esto es, tenemos un archivo de interface (.h) y un archivo de implementación (.m) los cuales son definidos de la siguiente manera:

@interface MiClase : NSObject {
NSString *unaCadena;
}
- (NSInteger)suma1:(NSInteger)num1 suma2:(NSInteger)num2;
+ (NSString *)cadenaFija;

@end

@implementation MiClase

- (NSInteger)suma1:(NSInteger)num1 suma2:(NSInteger)num2 {
return num1+num2;
}
+ (NSString *)cadenaFija {
return @"Mi Clase";
}
@end

Los componentes que podemos resaltar del código anterior son "@interface MiClase : NSObject" donde @interface es la directiva para declarar nuestra interfaz de clase, "MiClase" es el nombre de nuestra clase y " : NSObject" la cual nos indica que "MiClase" hereda de NSObject (toda clase debe heredar de otra, NSObject es la clase padre de todas en Foundation framework). Entre llaves ( { } ) encontramos las propiedades de la clase que son accesibles mediante instancias de esta clase. El método "suma1:suma2:" es un método de clase (delimitado por el signo "-", lo que significa que debemos crear una instancia de la clase MiClase para acceder a el) el cuál recibe dos parámetros y regresa un NSInteger (entero con signo), y el método "cadenaFija" que es un método de instancia (delimitado por el signo "+", lo que significa que no debemos crear una instancia de la clase MiClase para acceder a el, sino simplemente llamar el método desde la clase de la forma [MiClase cadenaFija]) y regresa un NSString con el valor de @"Mi Clase". Y en el archivo de implementación encontramos "@implementation MiClase" donde definiremos las funcionalidades de los métodos definidos en el .h como se muestra arriba.

Obviamente hay muchas más cosas importantes de Objective-C como delegados, protocolos, properties, categorías, subclases, y demás, pero todo esto debe ser cubierto en temas aparte para su mejor comprensión. Esta pequeña introducción ha sido a manera de sólo cubrir conceptos básicos del lenguaje para gente interesada en el desarrollo de apps para iPhone/iPad. Los tutoriales posteriores pretenden enfocarse en los temas ya mencionados para dar un preámbulo más extenso acerca de Objective-C y sus grandes características.

Fuentes Citadas: