Classi e oggetti Objective-C

Lo scopo principale del linguaggio di programmazione Objective-C è quello di aggiungere l'orientamento agli oggetti al linguaggio di programmazione C e le classi sono la caratteristica centrale di Objective-C che supportano la programmazione orientata agli oggetti e sono spesso chiamate tipi definiti dall'utente.

Una classe viene utilizzata per specificare la forma di un oggetto e combina la rappresentazione dei dati e i metodi per manipolare tali dati in un unico pacchetto pulito. I dati e i metodi all'interno di una classe sono chiamati membri della classe.

Caratteristica obiettivo-C

  • La classe è definita in due diverse sezioni, vale a dire @interface e @implementation.

  • Quasi tutto è in forma di oggetti.

  • Gli oggetti ricevono messaggi e gli oggetti vengono spesso definiti destinatari.

  • Gli oggetti contengono variabili di istanza.

  • Gli oggetti e le variabili di istanza hanno ambito.

  • Le classi nascondono l'implementazione di un oggetto.

  • Le proprietà vengono utilizzate per fornire l'accesso alle variabili di istanza di classe in altre classi.

Definizioni di classe Objective-C

Quando si definisce una classe, si definisce un progetto per un tipo di dati. Questo in realtà non definisce alcun dato, ma definisce cosa significa il nome della classe, cioè di cosa sarà composto un oggetto della classe e quali operazioni possono essere eseguite su tale oggetto.

Una definizione di classe inizia con la parola chiave @interfaceseguito dal nome dell'interfaccia (classe); e il corpo di classe, racchiuso da un paio di parentesi graffe. In Objective-C, tutte le classi derivano dalla classe base chiamataNSObject. È la superclasse di tutte le classi Objective-C. Fornisce metodi di base come l'allocazione e l'inizializzazione della memoria. Ad esempio, abbiamo definito il tipo di dati Box utilizzando la parola chiaveclass come segue -

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

@end

Le variabili di istanza sono private e sono accessibili solo all'interno dell'implementazione della classe.

Allocazione e inizializzazione di oggetti Objective-C

Una classe fornisce i progetti per gli oggetti, quindi fondamentalmente un oggetto viene creato da una classe. Dichiariamo gli oggetti di una classe con esattamente lo stesso tipo di dichiarazione con cui dichiariamo variabili di tipi base. Le seguenti istruzioni dichiarano due oggetti della classe Box -

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

Entrambi gli oggetti box1 e box2 avranno la propria copia dei membri dati.

Accesso ai membri dei dati

È possibile accedere alle proprietà degli oggetti di una classe utilizzando l'operatore di accesso diretto ai membri (.). Proviamo il seguente esempio per chiarire le cose:

#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;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

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

Proprietà

Le proprietà vengono introdotte in Objective-C per garantire che la variabile di istanza della classe sia accessibile al di fuori della classe.

Le varie parti della dichiarazione di proprietà sono le seguenti.
  • Le proprietà iniziano con @property, che è una parola chiave

  • È seguito da specificatori di accesso, che sono non atomici o atomici, readwrite o readonly e forti, unsafe_unretained o weak. Questo varia in base al tipo di variabile. Per qualsiasi tipo di puntatore, possiamo usare forte, unsafe_unretained o weak. Allo stesso modo per altri tipi possiamo usare readwrite o readonly.

  • Questo è seguito dal tipo di dati della variabile.

  • Infine, abbiamo il nome della proprietà terminato da un punto e virgola.

  • Possiamo aggiungere l'istruzione synthesize nella classe di implementazione. Ma nell'ultimo XCode, la parte di sintesi è curata dall'XCode e non è necessario includere l'istruzione di sintesi.

È possibile solo con le proprietà possiamo accedere alle variabili di istanza della classe. In realtà, internamente vengono creati metodi getter e setter per le proprietà.

Ad esempio, supponiamo di avere una proprietà @property (nonatomic ,readonly ) BOOL isDone. Sotto il cofano, ci sono setter e getter creati come mostrato di seguito.

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