Subscribe Twitter Twitter

viernes, 23 de abril de 2010

Objective-C : Variables

En objetive-C las variables son normalmente punteros que apuntan a objetos independientemente del tipo que sea, bien es cierto que tenemos tipos primitivos como el int pero también tenemos su versión en objeto que es la clase NSInteger, por ello al igual que ocurriá en C cuando estamos hablando de punteros es inevitable tener que hablar de la gestión de memoria ya que se hace de manera manual, por lo tanto cuando tengamos una variable de tipo puntero será necesario antes de usarla reservar memoria (se hará con el método alloc) y una vez que hemos dejado de usarla se usará el método release para liberar la memoria que ocupe. Estos son unos conceptos básicos a la hora de desarrollar una aplicación ya que el iphone tiene limitada la memoria como hemos indicado en otro post por lo tanto todo lo que podamos hacer para evitar ocupar recursos sin necesidad será bien recibido. De todas maneras debido a la importancia de este concepto entraremos en profundidad más adelante.

Finalmente en objective-C a parte de reservar memoria es necesario inicializar los objetos mediante el método init del objeto correspondiente en el caso de que creemos una clase y no queramos tener ninguna inicialización particular, como todos los objetos heredan de NSObject se invoca al init del padre ( [super init] ).

Para los objetos de uso más habitual no es necesario hacerlo por lo que se puede hacer:

NSINteger* entero = 4;

NSString* cadena = @"Hola";


En el caso en el cual la inicialización sea dinámica esta manera no será válida y es necesario primeramente realizar un alloc y después el init.

Visibilidad

Al igual que en java en objective-c se puede limitar la visibilidad y el acceso de las variables mediante el uso de las directivas @public para variables accesibles desde cualquier clase de la aplicación y la directiva @private para variables accesibles SOLO desde la propia clase y desde las clases que hereden de la misma.

4 comentarios:

Curro dijo...

¿Con NSInteger no puedes declarar como en la programación típica de MacOS? Es decir

NSInteger entero = 4;

Noemí dijo...

Hola Curro tienes que hacer uso de punteros, he escrito un post al respecto

http://helloworldiphone.blogspot.com/2010/07/diferencias-entre-nsinteger-int-y.html

Espero que te resulte útil.

Curro dijo...

Hola Noemí, antes de seguir quiero agradeceros la existencia de este blog donde podemos ir aprendiendo un montón de cosas ¡en español! :-D , y también quiero disculparme por no haberme presentado ni daros las gracias en el primer mensaje que escribí un poco rápido de más :-P
La verdad es que llevo poco tiempo (un mes) buceando en ObjectiveC y Cocoa (¡Me animé a comprar un Mac :-D!) pero vengo de otros lenguajes.
Bueno, al grano, estuve buceando a partir de tu respuesta y viendo las definiciones y haciendo un par de pruebas resulta que NSInteger se establece como igual a long en arquitectura 32 bits (o IPhoneOS) e int en 64 bits. De esta manera consiguen que sea un tipo de dato que, independientemente de la arquitectura, siempre tenga 64bits, o al menos es lo que supongo. Fíjate la definición en NSObjRuntime.h. La transcribo:

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

De hecho prueba este código que funciona perfectamente:

NSInteger h,j=3, i=2;
h=j+i;
NSLog(@"resultado %i",h);

Entiendo que la nomenclatura NS es más que nada para encapsular la arquitectura usada y estandarizar el nombre de los tipos de datos. O al menos eso me parece ¿no?

Nuevamente gracias y aquí seguiremos esperando a por nuevos tutoriales :-)
Curro

Noemí dijo...

Hola Curro si yo creo q si lo del NS, gracias por tu comentario aclaratorio escribí el post sin probar el código porque ando sin el mac (le tengo en el servicio técnico).

Publicar un comentario