Subscribe Twitter Twitter

jueves, 22 de julio de 2010

Diferencias entre NSInteger , int y NSNumber

Estos tres tipos de datos se usan en objective C pero aunque parezcan iguales entre algunos de ellos existen tanto diferencias como similitudes.

Vamos a empezar por los tipos de datos NSInteger e int. ambos representan un dato de tipo entero y son tipos primitivos por lo que no es necesario reservar memoria dinámicamente e inicializarlos mediante el método init antes de empezar a usarlos. simplemente se declaran y si se quiere se les asigna un valor.

En concreto el tipo int es para arquitectura de 32 bits y se ha heredado del lenguaje C, por el contrario NSInteger es de objective-C y puede tener un tamaño u otro siendo esa su principal diferencia por lo que en nuestro caso para el desarrollo de apps para Iphone/Ipod/Ipad nos resulta ajeno y podemos usar cualquiera de los dos.

En cambio el tipo de dato NSNumber es un objeto que almacena un dato numérico ya sea entero/real/double... y por ello es necesario usar punteros ya que pertenece a objective-c sí hay que reservar memoria dinámicamente y a continuación inicializarlos, ya hemos visto en otros post que lo podemos inicializar a un valor concreto y sino la inicialización por defecto se realiza llamando al método init (con este método el objeto apunta a c)

int myEntero = 4;
NSInteger miEntero_2 = 5
;
NSNumber *miObjetoNumerico = [[NSNumber alloc] initWithInt:40]; // En este caso lo inicializamos con un valor de tipo entero en concreto el 40

sino la inicialización por defecto sería:

NSNumber *miObjetoNumerico = [[NSNumber alloc] init];

Sobre las dudas de "por ello es necesario usar punteros ya que pertenece a objective-c" fue un despiste, ya que es habitual el uso de punteros en objetive C.
¡Gracias a los que nos avisaron del error!

Programación desde Cero: y entonces.. ¿qué es un Objeto?

La palabra objeto estarás harto de escucharla en cualquier libro de programación pues bien, una vez que sabemos lo que es una clase vamos a ver que es un objeto.

La propia definición de objeto lo define como instancia de una clase. Aunque suene un poco raro en realidad un objeto es una clase en la cual lo datos que en la clase solo se indican por ejemplo en el caso del coche: pintura, motor, kilometraje ya en el objeto se les da un valor.

Por ejemplo Un BmwSerie1 es un objeto de la clase Coche pero ¿en qué se diferencia de éste?. En el BmwSerie1 sabemos que el color es blanco, motor 146CV y kilometraje 20.000 ya no tenemos un coche genérico que es lo que es la clase sino que tenemo un coche en concreto y le hemos llamado BmwSerie1.

Por lo que a las cualidades de una clase las vamos a denominar ATRIBUTOS, ¿qué pasa con esos atributos en un objeto? pues que toman un valor.

En el caso del coche los atributos son color, motor y kilometraje y ya hemos visto que para el objeto BmwSerie1 toma valores concretos de ese coche.

Pero hay una cosa que se nos está quedando en el tintero. En el post anterior hablamos de que ese coche genérico que es la clase realizaba una serie de acciones que las realizaban todos los coches independientemente de sus atributos, por decirlo de otra manera. Mi coche X arranca y frena y el coche Y de mi vecino también arranca y frena aunque sean de colores diferentes, distinto motor y diferente kilometraje por lo que a esas acciones que pueden realizar cualquier objeto las vamos a denominas métodos.

En resumidas cuentas siempre que creemos un objeto de la clase Coche tendremos los mismos métodos que la clase (en este caso arrancar, frenar...)

¿Qué tal ambos conceptos un poco más claros? Dejarme comentarios :)

Programación desde Cero: ¿Qué es una clase?

En muchísimos libros y manuales habrás visto que centenares de veces hacen referencia al concepto de clase y habrás pensado que a que pueden hacer referencia. Bueno voy a ver si puedo hacerme entender bien.

Por ejemplo un clase podría ser un coche que es un objeto genérico no? si ya hablamos de un renault o bwm lo que estamos hablando es de un coche concreto cada uno con sus características particulares. Bueno pues una clase es exactamente eso una manera de agrupar una serie de cosas que cumplen un cierto de carácterísticas comunes.

Independientemente de que tengamos un renaul o un bmw ambos tienen 4 ruedas, un volante.... que son características y ambos arrancan o paran estos son acciones que realizan todos los coches.

Otra manera para definir una clase es que en el caso del coche todas las características y cualidades básicas de un coche es la plantilla para el renault o el bmw lo que pasa que después por ejemplo el renanult será rojo y el bmw blanco.

Con esto solo tenéis que haber entendido el concepto básico de Clase.

Si no ha quedado muy claro enviarme un email(pynsoftware@gmail.com) y lo explico de otra manera :)

¿Por qué cuesta más programar para el Iphone?

En varios de vuestros comentarios se repite lo mismo es una plataforma diferente, todo es muy raro, he de deciros que eso son sensaciones y sentimientos habituales tanto si no has programado mucho como si tienes una solida formación en .net, java o php llegas a desarrollar con xcode y parece que todos esos años de experiencia y sólida formación universitaria se vienen abajo.

Nada más lejos de la realidad, solo viendo un nuevo proyecto en el XCode nos damos cuenta de que estamos adentrándonos en un nuevo mundo de programación y que lo que sabíamos puede servinos poco en el mejor de los casos o nada.

Solo deciros que no os desanimeis que eso nos ha pasado a todos y para eso estamos aqui.

También quería agradeceros el apoyo que nos habéis dado a través de vuestros comentarios :)

Nuestro mail ya sabéis que es pynsoftware@gmail.com

martes, 20 de julio de 2010

La gestión memoria (I)

La gestión de memoria es fundamental hacerlo de manera correcta cuando desarrollemos cualquier aplicación tanto para iphone/ipod e ipad ya que aunque éste último disponga de mayor memoria que los anteriores si no se tiene un poco de cuidado se puede igualmente llegar a saturar y como consecuencia nuestra aplicación se cierra inesperadamente pero que no cunda el pánico ya que una vez que se vuelva a iniciar la aplicación nuestra memoria estará limpia como si tal eventualidad no hubiera sucedido. A diferencia de java en iphone sdk no disponemos de un recolector de basura que se encargue de ir liberando la memoria de las variables que no se usen.

Como ya vimos en un post anterior los objetos, arrays.... son punteros a tipos de datos o estructuras de datos y que hay que reservar memoria para el uso de los mismos por ello una vez que finalicemos el uso de una determinada variable es conveniente liberar la porción de memoria que tenía asignada para que pueda ser reutilizada por otra parte de la aplicación y de esa manera evitar que los recursos se vayan saturando por ello deberemos llamar al método release cuando queramos liberar la memoria de un determinado elemento.


NSInteger entero = [[NSInteger alloc] initWithInt:30]; // Reservamos e inicializamos el objeto de tipo entero

// codigo


[entero release] // liberamos la memoria ocupada por el objeto

XCode: La Consola

La consola es un recurso muy útil que nos facilita mucho la tarea de depuración ya que cuando estamos programando una aplicación y sobre todo al principio se producen errores comunes que desconocemos que ha pasado y de esa manera podemos seguir la traza que ha seguido el programa ya que como hemos visto en el video los projectos tienen muchos ficheros de diferente naturaleza y así podemos ir viendo por donde va pasando al ejecución o donde se produce la excepción que hace que nuestra app se cierre de manera inesperada, para escribir las trazas en el programa se hace uso de la clase NSLog y pasandole como parámetro la cadena que queremos que escriba en la consola. Como todas las cadenas en objective-C el formato de la misma es @"mi mensaje" y de esta manera se escribirá en la consola la cadena mi mensaje cuando pase la ejecución por dicho punto añadiendo información adicional como fecha, hora y aplicación que estamos ejecutando


NSLog(@"mi Mensaje");

Por la consola el mensaje se mostraría de la siguiente manera:
2010-07-20 10:51:28.028 ejemplo[4200:b03] mi Mensaje


También es interesante destacar que con el NSLog se pueden mostrar diferentes valores y cadenas de texto con formato al igual que se hace en c se coloca en la cadena de texto el indicador %d para enteros y %f para datos float y como parámetros sucesivos se van a pasar las variables que queramos mostrar en el mismo orden que hemos puesto los indicadores correspondientes y para que haya un salto de línea se pone el indicador /n.

int entero = 4
float decimal = 4.3;
NSLog(@"Vamos a mostrar un entero %d/n y un decimal &f",entero,decimal);

Por la consola el mensaje se mostraría de la siguiente manera:
2010-07-20 11:05:28.028 ejemplo[8720:b16] Vamos a mostrar un entero 4
y un decimal 4.3

Objective C: Los comentarios

Cuando esta entrada parezca trivial los comentarios tienen mucha más importancia de la que se le da, en mis años de experiencia de programador me he dado cuenta de que no es una práctica muy usada, quiza sea por problemas de tiempo pero he de decir además que el hecho de usar comentarios no es trabajar en vano ya que como programadores a lo largo de nuestra vida laboral pasan por nuestras manos muchísimos proyectos, cada uno de su padre y de su madre y el uso de comentarios hace que la resolución de incidencias sea más rápida ya que con esa pequeña práctica el programador que hizo el código nos transmite de manera clara qué hizo y por qué lo hizo asi, por otro lado en nuestro propio código nos facilita los mantenimientos notablemente por ello os animo a que el uso de comentarios empiece a formar parte de vuestra manera de programar y sin extenderme mucho más o diré que en objective-c hay dos tipos de comentarios:

// mediante este símbolo comentamos hasta el final de la línea desde donde se coloque.
/* bloque */ y mediante estos otros podemos comentar un bloque de código independientemente de que ocupe más de una línea.

Objective C: Los tipos de datos

Como ya hemos visto en algún ejemplo usamos objetos para representar los tipos de datos en objective-C, por ejemplo para objetos con información de tipo entero usamos NSInteger para las cadenas de caracteres hacemos uso de la clase NSString pero a pesar de todo esto, objective-c cuenta con una serie de tipos de datos primitivos que se pueden usar de igual manera para realizar operaciones pero no será necesario ni reservar memoria e inicializarlos con los métodos tanto alloc como init como sucede con sus versiones correspondientes en objetos sino que se usan tal cual como en cualquier otro lenguaje de programación. He de decir además que no todos tienen su versión en objeto sino que se usan tal cual como el void o el booleano.

Son los siguientes:

int -> Entero positivo o negativo
unsigned -> Entero positivo
float -> Números con decimales
double -> Números decimales con doble precisión, normalmente este tipo de dato se usa cuando necesitamos tener un alto grado de precisión en los cálculos numéricos.
char -> Cáracter
BOOL ->Boolean, puede tomar diferentes tipos de valores: YES/NO, 1/0 , TRUE/FALSE

jueves, 15 de julio de 2010

Tutorial 3 - Programación iphone - Hola Mundo!

Hola a tod@s ya tenémos nuevo tutorial de desarrollo de aplicaciones para el iphone!!! Espero que os guste.



Lo he subido también a Vimeo.

Tutorial 3 Hola Mundo // pynsoft.com // www.iphoneprogramacion.com from Pynsoft on Vimeo.



El código fuente de este tutorial está disponible en: Pynsoft/Recursos

lunes, 5 de julio de 2010

Tutorial 2 - Programación iphone - INTERFACE BUILDER

Hola de nuevo, tenémos un nuevo tutorial sobre el Interface Builder, espero que os resulte útil, en este tutorial vamos a realizar la parte visual para el hola mundo que terminaremos en el siguiente tutorial.





Lo he subido también a Vimeo.


Tutorial 2 Introducción al iphone sdk INTERFACE BUILDER// pynsoft.com // www.iphoneprogramacion.com from Pynsoft on Vimeo.

El código fuente de este tutorial está disponible en: Pynsoft/Recursos