Objetos y clases de Objective-C

El propósito principal del lenguaje de programación Objective-C es agregar orientación a objetos al lenguaje de programación C y las clases son la característica central de Objective-C que admiten la programación orientada a objetos y a menudo se denominan tipos definidos por el usuario.

Una clase se usa para especificar la forma de un objeto y combina la representación de datos y métodos para manipular esos datos en un paquete ordenado. Los datos y métodos dentro de una clase se denominan miembros de la clase.

Característica de Objective-C

  • La clase se define en dos secciones diferentes, a saber @interface y @implementation.

  • Casi todo está en forma de objetos.

  • Los objetos reciben mensajes y los objetos a menudo se denominan receptores.

  • Los objetos contienen variables de instancia.

  • Los objetos y las variables de instancia tienen alcance.

  • Las clases ocultan la implementación de un objeto.

  • Las propiedades se utilizan para proporcionar acceso a variables de instancia de clase en otras clases.

Definiciones de clase Objective-C

Cuando define una clase, define un plano para un tipo de datos. En realidad, esto no define ningún dato, pero define lo que significa el nombre de la clase, es decir, en qué consistirá un objeto de la clase y qué operaciones se pueden realizar en dicho objeto.

Una definición de clase comienza con la palabra clave @interfaceseguido del nombre de la interfaz (clase); y el cuerpo de la clase, encerrado por un par de llaves. En Objective-C, todas las clases se derivan de la clase base llamadaNSObject. Es la superclase de todas las clases de Objective-C. Proporciona métodos básicos como la asignación de memoria y la inicialización. Por ejemplo, definimos el tipo de datos Box usando la palabra claveclass como sigue -

@interface Box:NSObject {
   //Instance variables
   double length;    // Length of a box
   double breadth;   // Breadth of a box
}
@property(nonatomic, readwrite) double height;  // Property

@end

Las variables de instancia son privadas y solo se puede acceder a ellas dentro de la implementación de la clase.

Asignar e inicializar objetos Objective-C

Una clase proporciona los planos de los objetos, por lo que básicamente un objeto se crea a partir de una clase. Declaramos objetos de una clase con exactamente el mismo tipo de declaración que declaramos variables de tipos básicos. Las siguientes declaraciones declaran dos objetos de la clase Box:

Box box1 = [[Box alloc]init];     // Create box1 object of type Box
Box box2 = [[Box alloc]init];     // Create box2 object of type Box

Ambos objetos box1 y box2 tendrán su propia copia de miembros de datos.

Acceso a los miembros de datos

Se puede acceder a las propiedades de los objetos de una clase mediante el operador de acceso directo a miembros (.). Probemos con el siguiente ejemplo para aclarar las cosas:

#import <Foundation/Foundation.h>

@interface Box:NSObject {
   double length;    // Length of a box
   double breadth;   // Breadth of a box
   double height;    // Height of a box
}

@property(nonatomic, readwrite) double height;  // Property
-(double) volume;
@end

@implementation Box

@synthesize height; 

-(id)init {
   self = [super init];
   length = 1.0;
   breadth = 1.0;
   return self;
}

-(double) volume {
   return length*breadth*height;
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
   Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
   Box *box2 = [[Box alloc]init];    // Create box2 object of type Box

   double volume = 0.0;             // Store the volume of a box here
 
   // box 1 specification
   box1.height = 5.0; 

   // box 2 specification
   box2.height = 10.0;
  
   // volume of box 1
   volume = [box1 volume];
   NSLog(@"Volume of Box1 : %f", volume);
   
   // volume of box 2
   volume = [box2 volume];
   NSLog(@"Volume of Box2 : %f", volume);
   
   [pool drain];
   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

Propiedades

Las propiedades se introducen en Objective-C para garantizar que se pueda acceder a la variable de instancia de la clase fuera de la clase.

Las distintas partes de la declaración de propiedad son las siguientes.
  • Las propiedades comienzan con @property, que es una palabra clave

  • Le siguen especificadores de acceso, que son atómicos o no atómicos, de lectura y escritura o de solo lectura y fuertes, unsafe_unretained o débil. Esto varía según el tipo de variable. Para cualquier tipo de puntero, podemos usar fuerte, unsafe_unretained o débil. Del mismo modo, para otros tipos, podemos usar readwrite o readonly.

  • A esto le sigue el tipo de datos de la variable.

  • Finalmente, tenemos el nombre de la propiedad terminado con un punto y coma.

  • Podemos agregar una declaración de síntesis en la clase de implementación. Pero en el último XCode, el XCode se encarga de la parte de síntesis y no es necesario incluir una declaración de síntesis.

Solo es posible con las propiedades podemos acceder a las variables de instancia de la clase. En realidad, se crean métodos getter y setter internos para las propiedades.

Por ejemplo, supongamos que tenemos una propiedad @property (nonatomic ,readonly ) BOOL isDone. Debajo del capó, hay setters y getters creados como se muestra a continuación.

-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;