Curso Básico de Objective C: Objetos NS:NSDate, NSArray, NSDictionary y NSString

NSDate

Es uno de los objetos principales de la biblioteca Fundation, nos permite manejar fechas y traducirlas a Cadenas y viceversa. 
        NSDate *fecha   =[[NSDate alloc]init];
        NSLog(@”%@”, fecha );
Como podemos ver en el ejemplo una fecha puede ser inicializada como un objeto normal. Al intentar imprimirla por consola, nos saca un mensaje similar al siguiente:

2014-03-13 00:48:10.323 03_objetos_principales[1467:303] 2014-03-12 23:48:10 +0000

Donde la parte importante es:
2014-03-12 23:48:10 +0000

Que es la fecha inicial del momento en el que se ejecutó la sentencia. Como puede verse nos devuelve un formato cadena en el indica en el siguiente orden:

  • año
  • mes
  • dia
  • hora
  • minuto
  • segundo
  • franja horaria

Este es el formato anglosajón de fechas, aunque podríamos llegar a obtener la información en segundos desde el 1 de enero de 1970, de la siguiente manera:

        double segundosdesde1970=[fecha timeIntervalSince1970];
        NSLog(@”%f”,segundosdesde1970);

Aunque lo que normalmente nos suele interesar en disponer de una fecha un poco más legible por parte del usuario:

NSLog(@”Descripcion:%@”,[fecha descriptionWithLocale:[NSLocale currentLocale]]);

Lo cual nos saldrá una salida en nuestro idioma por defecto:

jueves, 13 de marzo de 2014 00:56:09 Hora estándar de Europa central

También suele ser interesante la generación de una fecha en base a una fecha que a nosotros nos interese:

NSDate *fecha2=[[NSDate alloc] initWithString:@”2001-03-24 10:45:32 +0600″];

Con este tipo de inicialización indicamos los datos de la fecha con el mismo orden que indicamos anteriormente y tendremos un objeto NSDate con la fecha indicada.

Y luego podríamos gestionar un salida por pantalla eligiendo los datos y el orden de los mismos gestionando el formato de la cadena de salida:

NSLog(@”%@”,[fecha2 descriptionWithCalendarFormat:@”%d/%m/%Y” timeZone:nil locale:[NSUserDefaults standardUserDefaults]]);

Esto nos proporciona una salida similar a la siguiente:

24/03/2001

NSArray

Los arrays son una necesidad a la hora de gestionar conjuntos de datos, para ello Objective C nos provee de esta clase que nos facilita las cosas a la hora de gestionar los arrays.

Veamos un ejemplo de inicialización de un array con dos elementos:

 NSArray * array= [NSArray arrayWithObjects:@”uno”@”dos”nil];

Como se puede ver tenemos un array con dos elementos, el primero es un cadena de caracteres con el valor uno y el segundo otra cadena. Para inicializar el array utilizamos un método de clase llamado arrayWithObjects que nos permite un número indefinido de parámetros. De lo único que debemos recordar es que debemos terminar con un último parámetro cuyo valor sea nil para terminar la definición de los elementos. Y nos devolverá el array con los objetos que le hemos indicado.

Es una manera muy fácil de rellenar estos arrays, veamos ahora las funciones típicas de uso de arrays, empezando por el atributo count:

NSLog(@”%lu”, (unsigned long)array.count);

Con count podemos ver el número de elementos que tiene el array.

Con el objectAtIndex podemos pedirle que nos devuelva el objeto que esté presente en una posición:

NSLog(@”%@”, [array objectAtIndex:0]);

for-each

Este tipo especial de bucle está preparado para recorrer colecciones de elementos, de una manera similar a cómo sucede en Java, veamos un ejemplo:
        for (id object in array) {
            NSLog(@”%@”, object);
        }
Como puede verse tenemos un array y lo vamos a recorrer con el bucle. En cada una de las iteraciones tendremos un objeto llamado object que tendrá el valor del objeto que se encuentre en la posición que corresponda dentro de la iteración. Empezando por el primer objeto y terminando por el último. Así recorreremos el array de una manera muy cómoda.

Otras métodos interesantes

También disponemos de un método que nos permite si un objeto está presente dentro del array llamado containsObject :
       NSLog(@”%d”,[array containsObject:@”uno”]);
Como puede verle le pasamos como parámetro el objeto que estamos buscando. Nos devolverá un valor entero 1 si está 0 si no está. 
El método indexOfObject nos permite buscar un elemento en el array y nos devuelve la posición del objeto:
NSLog(@”%lu”,(unsigned long)[array indexOfObject:@”uno”]);
 Y ya por último el método   nos permite saber si dos arrays son iguales o no:
NSLog(@”%hhd”,[array isEqual:array]);

NSMutableArray

Con esta clase podremos manejar un array de objetos pero en el que podremos modificar dinámicamente en tiempo de ejecución el número de objetos que contiene. Veamos su inicialización:
NSMutableArray *arraymutable=[[NSMutableArray alloc]init];
Como vemos se inicializa como un objeto normal.
Para añadir objetos usaremos el método addObject  como en el ejemplo:
[arraymutable addObject:@”uno”];
También disponemos de un método que permite eliminar un objeto según su posición:
[arraymutable removeObjectAtIndex:0];
Evidentemente los NSMutableArray también pueden ser recorridos con un for-each, coger un elemento por su posición y contar el número de elementos:
        
        for (id object in arraymutable) {
            NSLog(@”%@”, object);
        }

        NSLog(@”%lu”, (unsigned long)[arraymutable count]);
        
        NSLog(@”%@”, [arraymutable objectAtIndex:0]);
       
        NSLog(@”%@”,arraymutable);

NSDictionary

Los NSDictionary nos van a permitir guardar pares de objetos en forma de listado.  Cada par dispone de una clave y un valor.  Veamos cómo inicializar un diccionario:

        NSDictionary *diccionario=[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@”uno”@”dos”nilforKeys:[NSArray arrayWithObjects:@”1″,@”2″nil]];

Como pude verse se utiliza el método dictionaryWithObjects la cual necesita dos parámetros un array con los valores y otro con las claves. En el ejemplo estamos inicializando dos arrays en la misma línea de inicialización del diccionario.

Para recoger el valor relacionado con una clave, usaremos el método objectForKey para lo cual necesitamos pasarle como parámetro la clave relacionada:

NSLog(@”%@”, [diccionario objectForKey:@”1″]);

Para recorrer el diccionario podemos usar un foreach, de la siguiente manera:

        for (NSObject* key in diccionario) {
            id value = [diccionario objectForKey:key];
            NSLog(@”Clave:%@”, key);
            NSLog(@”Valor:%@”, value);
        }

  También podemos recoger todos las claves y los valores con estos dos métodos:

        NSLog(@”%@”,[diccionario allKeys]);
        NSLog(@”%@”,[diccionario allValues]);       

NSMutableDictionary

Los NSMutableDictionary funcionan de una manera similar a los NSDictionary pero pudiendo modificar al vuelo los objetos que almacena. Veamos un ejemplo de inicialización:

        NSMutableDictionary *diccionariomutable=[[NSMutableDictionary alloc]init];

En este caso, lo estamos inicializando de manera vacía. Ahora intentaremos añadir un nuevo par al diccionario:
        [diccionariomutable setValue:@”uno” forKey:@”1″];

En este caso estamos añadiendo una cadena de caracteres como primer parámetro, el valor, y como segundo parámetro la clave relacionada. 

Por supuesto podemos coger el valor asociado a una clave:
        NSLog(@”%@”, [diccionariomutable objectForKey:@”1″]);
También podemos borrar todos los elementos del diccionario:
        [diccionariomutable removeAllObjects];
Borrar elementos por su clave:
        [diccionariomutable removeObjectForKey:@”1″];
Recorrer el diccionario:
        for (NSObject* key in diccionariomutable) {
            id value = [diccionariomutable objectForKey:key];
            NSLog(@”%@”, value);
        }

NSString

 La Clase NSString permite el almacenamiento de una cadena de caracteres. Veamos un ejemplo de  inicialización básico:

        NSString *cadena=[[NSString alloc]init];
        cadena=@”Literal”;

Con la propiedad length podemos saber la longitud de la cadena:

       NSLog(@”logitud: %lu”,(unsigned long)cadena.length);

 Ahora veremos una inicialización directa con un literal:

        NSString *otracadena=[[NSString allocinitWithString:@”Otro Literal”];

Podemos inicializarla también mediante un formato con variables:
        NSString *cad=[[NSString allocinitWithFormat:@”con formato %@”,cadena, nil];
Incluso recorrerla con un for:
        for (int i=0; i<cad.length; i++) {
            NSLog(@”%c”,[cad characterAtIndex:i]);
        }
Convertirla en mayúsculas:
        NSLog(@”%@”,[cad uppercaseString]);
minúsculas:
        NSLog(@”%@”,[cad lowercaseString]);
saber si es igual a otra cadena:
        NSLog(@”%d”,[cad isEqual:cad]);
saber si tiene un prefijo o un sufijo:
        NSLog(@”%d”,[cad hasPrefix:@”con”]);
        NSLog(@”%d”,[cad hasSuffix:@”Literal”]);

NSMutableString

Este tipo especial de cadena de caracteres es modificable sin la necesidad de crear nuevos objetos constantemente, veamos su inicialización:
NSMutableString *mutante=[[NSMutableString alloc]initWithFormat:@”Cadena con numero %d”3];
Podemos añadir contenido al final de la cadena:
        [mutante appendString:@” con apendice”];
Incluso hacer copias de cadenas:
        NSMutableString *nuevacadena=[cad mutableCopy];

NSNumber

Nos permite almacenar números enteros, aquí hay un ejemplo de inicialización y uso:
        NSNumber *numero=[[NSNumber alloc]initWithInt:7];
        NSLog(@”%d”,numero.intValue);
        NSLog(@”%@”,numero);

EJERCICIOS PROPUESTOS

  • Crea un nuevo proyecto que permita realizar estos ejercicios.
  • Crea una nueva clase que se llama Evento, que contenga los siguientes datos: identificativo numérico, nombre, lugar, fecha inicio, fecha fin, número de asistentes.
  • Crea un constructor sin parámetros y otro con parámetros en la clase Evento.
  • Dentro del main.m: crea un par de objetos de la Clase Evento. El primero inicializarlo con el constructor sin parámetros y el segundo con el constructor con parámetros.
  • Meter los datos en las propiedades del primer objeto mediante el uso de sus propiedades.
  • Modificar los datos del segundo objeto mediante los setter.
  • Crea un array estático de 3 objetos de tipo Evento.
  • Imprime por consola el segundo elemento del array.
  • Crea un array dinámico de 20 objetos de tipo Evento. 
  • Imprime por consola todos los datos de cada Evento del array dinámico. 
  • Eliminar el último objeto del array dinámico y vuelve a presentarlo por consola. 
  • Cre un diccionario dinámico que contenga los datos de un Evento como valores dentro del diccionario, las claves relacionadas con esos valores serán cadenas de caracteres con el nombre de la propiedad del objeto Evento. Es decir, en la clave @”nombre” deberá estar el nombre del evento, y el resto igual. 

Curso Básico Objective C: Variables básicas y Operadores Aritméticos

Las variables básicas de Objetive C funcionan como en C, veamos los tipos básicos:

int

    Declaración:

    int entero;

    Asignación:

         
            entero=1;
            NSLog(@”%d”,entero);

    short, long, unsigned

            short corto=3;
            NSLog(@”%d”,corto);
            
            long largo=33424234;
            NSLog(@”%ld”,largo);
            
            unsigned long muylargo=21312313424545;
            NSLog(@”%ld”,muylargo);

    Coma flotante (con decimales): float, double

            float condecimales=3.3f;
            NSLog(@”%f”,condecimales);

            

            double conmuchosdecimales=3.34453543546;

            NSLog(@”%f”,conmuchosdecimales);

    Booleanos

            BOOL primera=YES;
            NSLog(@”%d”,primera);
            primera=NO;
            NSLog(@”%d”,primera);
            primera=TRUE;
            primera=true;
            primera=1;

    Caracteres

            char caracter=‘a’;

            

            NSLog(@”%c”,caracter);

    Literales de Cadena de Caracteres 

            

            NSLog(@”nuevalineaya!notra linea”);

    Operadores Aritméticos

            int i=1;
            int j=3;

            

            int k=0;
            float res;

            

            k=i+j;
            NSLog(@”%d”, k);

            i+=j;
            NSLog(@”%d”, i);

            k=i-j;
            NSLog(@”%d”, k);

            i-=j;
            NSLog(@”%d”, i);

            k=i*j;
            NSLog(@”%d”, k);

            i*=j;
            NSLog(@”%d”, i);

            // hay que hacer casting a float

            res=(float)i/j;
            NSLog(@”%f”, res);

            res/=j;
            NSLog(@”%f”, res);

    Curso de Objective C Básico: Introducción al Lenguaje de programación Objective C

    Ya teniendo claro como funciona el entorno, lo suyo es empezar por las bases del lenguaje, sus características principales y su funcionamiento básico.

    Introducción

    Teniendo claro como crear proyectos en Xcode, ahora ya podemos incluir nuevo código en los proyectos. Para empezar y sin que sirva de precedente modificaremos el fichero main.m.
    Los ficheros .m son los ficheros de implementación y los ficheros .h serán los ficheros de cabecera. Como puede apreciarse en sus similitudes, básicamente Objective C es como C pero vitaminado y orientado a objetos por lo que dispondremos de bibliotecas de clases bastante potentes a la hora de hacer nuestras aplicaciones, como este curso está enfocado a aprender el lenguaje en sí mismo, no veremos muchas de las bibliotecas disponibles para el lenguaje, ya que muchas de ellas van enfocadas al desarrollo gráfico de aplicaciones que es donde Objective C destaca, pero como todo se debe aprender desde lo básico es por donde vamos a empezar. 

    Estructura del fichero main.m

    Como en un lenguaje derivado de C tenemos todos los elementos de este lenguaje disponibles, estructuras de control y variables incluidas, pero veamos el ejemplo del fichero generado por el asistente de Xcode:
    //
    //  main.m
    //  00_introduccion
    //
    //  Created by pepesan on 24/02/14.
    //  Copyright (c) 2014 pepesan. All rights reserved.
    //
    #import <Foundation/Foundation.h>
    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            
            // insert code here…
            NSLog(@”Hello, World!”);
            
        }
        return 0;
    }

    Comentarios

    Como se puede ver en el código, tenemos los típicos comentarios de una línea al principio del fichero, que son los // que vemos al principio de cada línea, aunque también podemos disponer de los comentarios de varias líneas /*…*/ he aquí los ejemplos

    //comentario de una línea
            
    /*
    Comentario de varias líneas

    */

    Imports

    Las importaciones son como las inclusiones de C, nos permiten tener acceso a otros ficheros para incluir su contenido y definiciones, pero como en Objective C las bibliotecas son muy completas, normalmente nos facilitan su inclusión mediante un fichero de cabecera de resumen que incluye todo el contenido de la biblioteca con un sólo import, en el ejemplo tenemos la inclusión de la biblioteca principal de objetos de Objective C
    #import <Foundation/Foundation.h>
    Esta biblioteca es la que tiene los objetos de datos principales, podemos consultar las clases desde la página oficial de Apple:
    Siempre que necesitemos hacer uso de otra clase en un fichero .m tendremos que hacer referencia al fichero de cabecera .h que defina dicha clase o conjunto de clases.

    Función main

    Como la función main de C será la encargada de gestionar el flujo principal de nuestra aplicación. Tiene los típicos parámetro de entrada de C, con el número de argumentos y los argumentos de llamada al programa desde línea de comandos y tiene que devolver un número entero como valor de resultado del programa, lo típico. Si vienes de C lo entenderás a la primera. 
    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            
            // insert code here…
            
        }
        return 0;
    }
    El @autoreleasepool lo que intenta es definir un entorno para que todas las variables definidas bajo ese entorno, comprendido entre las {} deberán ser liberadas de la memoria según se salga del pool.

    ARC

    El Automatic Reference Counting es la base de la gestión de la memoria es Objective C. Funciona de una manera distinta a C o Java. el ARC, como lo llamaremos a partir de ahora, lo que trata de hacer es evitar que el programador tenga que manualmente liberar la memoria de todas las variables, a fin de evitar quedarnos sin memoria en el dispositivo o tener memory leaks,  por lo que el programador sólo debe centrarse en reservar la memoria suficiente para los datos a almacenar y de definir que tipo de puntero necesitaremos para apuntar a esa memoria. Aunque este tema lo trataremos con más profundidad en la gestión de variables, podemos adelantar que respecto a ARC tenemos dos tipos de variables, las strong y las weak. Las strong mantendrán en la memoria los datos hasta que nos salgamos de su ámbito de actuación, pero las weak, no liberarán la memoria al salirse de ámbito. Por lo que podríamos considerar que las strong los las poseedoras de los datos en memoria y las weak son meros punteros a la información.  Si se libera una variable weak, no pasa nada, mientras que siga existiendo una strong sobre el dato. Sin embargo si la variable strong es la última que apunta a los datos y ésta sale de ámbito, el dato referenciado se liberará de memoria. 

    Trazas

    Como en todo lenguaje es posible sacar mensajes con pantalla/consola esto lo realiza la clase NSLog, como puede verse en el ejemplo:
    NSLog(@”Hello, World!”);
    Como puede verse de trata de la ejecución de una “función” al que se le pasa como parámetro una cadena de caracteres, en este caso utilizamos un literal, pero todos los literales en Objective C van precedidos de una @ y entre “”.
    En Este caso saldrá por la consola el mensaje entrecomillado Hello, World!
    Y por supuesto como toda sentencia C debemos terminarla con un ;

    Conclusiones

    Así que tenemos a un lenguaje similar a C con @ a lo anotaciones de Java, Orientado a objetos y con @antes de los literales de cadenas de caracteres, un poco rarito pero funcional. 

    Suscríbete al Boletín

    Si quieres estar al tanto de las novedades del blog, ya sabes :)
    * = campo obligatorio

    powered by MailChimp!

    Uso de cookies

    Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR

    Aviso de cookies