Capítulo I: Objective-C. Lección 2: Métodos y miembros.

Niveles de acceso a miembros.

El nivel de acceso a miembros de una clase se especifica de manera similar a c++:

//Clase.h @interface Clase : NSObject { @private         int miembroPrivado1;         int miembroPrivado2; @public         int miembroPublico; @protected         int miembroProtegido; } // //  Clase.m #import “Clase.h” @implementation Clase @end

Los miembros públicos son utilizados de la siguiente manera:

#include <stdio.h> #import “Clase.h” int main (int argc, const char * argv[]) {     Clase *c = [[Clase alloc] init];     //Acceder a miembroPublico     c->miembroPublico = 69;     printf(“Miembro Público: %d\n”, c->miembroPublico );     // No se puede acceder al miembroPrivado     //c->miembroPrivado1 = 123;     //printf(“Miembro Privado: %d\n”, c->miembroPrivado1 );     [c release];     return 0; }

Métodos en Objective-C.

Ya vimos la declaración y definición de métodos en objective-c en la lección pasada, pero aún quedan algunos detalles por ver, en primer lugar veamos los métodos de Instancia y Métodos de Clase:

//  NumeroComplejo.h #import <Cocoa/Cocoa.h> @interface NumeroComplejo : NSObject {         int parteReal;         int parteImaginaria; } //Métodos de Instancia -(void) initWithParteReal: (int)_parteReal ParteImaginaria:(int)_parteImaginaria; -(void) sumarNumeroComplejo:(NumeroComplejo*)sumando; -(void) restarNumeroComplejo:(NumeroComplejo*)substrayendo; -(int) getParteReal; -(int) getParteImaginaria; //Métodos de Clase +(NumeroComplejo*) sumarNumerosComplejos:(NumeroComplejo*)sumandoUno SumandoDos:(NumeroComplejo*)sumandoDos; +(void) initialize; @end

Los métodos de instancia solo pueden ser utilizados si se ha creado una instancia de la clase [instanciaDeNumeroComplejo sumarNumeroComplejo:otraInstancia], los métodos de clase pueden ser usados sin crear una instancia de la clase, se utilizan a través del nombre de la clase: [NumeroComplejo initialize]. Initialize es un método especial de objective-c, el cual es invocado automáticamente, en el momento que se utilice la clase por primera vez, no es necesario que lo llames.

Métodos con muchos parámetros:

Cuando un método requiere de más de un parámetro se utiliza la siguinte forma:

+      (NumeroComplejo*) sumarNumerosComplejos:(NumeroComplejo*)sumandoUno SumandoDos:  (NumeroComplejo*)sumandoDos; //acceso (tipoDeRetorno)   nombreDeMétodo:       (tipoParametro1) parametro1 NombreParám2:(tipoParametro2) parametro2;

En este caso el Método llamado sumarNumerosComplejos es un método de Clase, que devuelve un NumeroComplejo* y toma dos parámetros NumeroComplejo*; algo que no existe ni en C/C++ ni java son los nombres de los parámetros, que no sirven para nada en el código, pero son muy útiles para el programador, ya que te dicen qué parámetro sigue.

Ahora veamos la implementación de la clase:

// //  NumeroComplejo.m #import “NumeroComplejo.h” @implementation NumeroComplejo -(void) initWithParteReal: (int)_parteReal ParteImaginaria:(int)_parteImaginaria {         self = [super init];     if ( self ) {         parteReal=_parteReal;         parteImaginaria=_parteImaginaria;     }     return self; } -(void) sumarNumeroComplejo:(NumeroComplejo*)sumando {         parteReal+=[sumando getParteReal];         parteImaginaria+=[sumando getParteImaginaria]; } -(void) restarNumeroComplejo:(NumeroComplejo*)substrayendo {         parteReal-=[sumando getParteReal];         parteImaginaria-=[sumando getParteImaginaria]; } -(int) getParteReal {         return parteReal; } -(int) getParteImaginaria {         return parteImaginaria; } //Métodos de Clase +(NumeroComplejo*) sumarNumerosComplejos:(NumeroComplejo*)sumandoUno SumandoDos:(NumeroComplejo*)sumandoDos {         NumeroComplejo *resultado=[[NumeroComplejo alloc]                                                            initWithParteReal:[sumandoUno getParteReal] ParteImaginaria:[sumandoUno getParteImaginaria]]         [resultado sumarNumeroComplejo:sumandoDos];         return [resultado autorelease]; //libera memoria cuando ya no es usada automaticamente } +(void) initialize {         //no necesito inicializar nada antes de usar la clase } @end

El método init.

-(void) initWithParteReal: (int)_parteReal ParteImaginaria:(int)_parteImaginaria;
  • El método init es parecido a los constructores de c++, en él, se asignan los valores iniciales de la instancia.
  • Verifica que alloc haya devuelto una instancia válida al compararla con nil, nil es el equivalente a NULL, pero nil es un objeto.
  • Para acceder al método del ancestro se utiliza super, como en [super init].
  • El constructor por defecto es -(id) init. El cual solo verifica que se haya creado la instancia, pero no inicializa valores.
  • En general los metodos init, en objective-c solo realizan operaciones de inicialización, y no otras operaciones como en java o c++.
#include <stdio.h> #import “NumeroComplejo.h” int main (int argc, const char * argv[]) {         //2i+1     NumeroComplejo *complejo1=[[NumeroComplejo alloc] initWithParteReal:1 ParteImaginaria:2];         //2i+3         NumeroComplejo *complejo2=[[NumeroComplejo alloc] initWithParteReal:3 ParteImaginaria:2];         //4i+4         NumeroComplejo *suma=[NumeroComplejo sumarNumerosComplejos:complejo1 SumandoDos:complejo2];         //5i+4         NumeroComplejo *complejo3=[[NumeroComplejo alloc] initWithParteReal:4 ParteImaginaria:5];         //9i+8         [suma sumarNumeroComplejo:complejo3];         //7i+5         [suma restarNumeroComplejo:complejo2];         //liberar memoria         [complejo1 release];         [complejo2 release];         [complejo3 release];         //suma no es liberada ya que es liberada automaticamente en el método sumarNumerosComplejos     return 0; }

Bien eso es todo por esta lección, saludos.