Classes et objets Objective-C

L'objectif principal du langage de programmation Objective-C est d'ajouter une orientation objet au langage de programmation C et les classes sont la caractéristique centrale d'Objective-C qui prennent en charge la programmation orientée objet et sont souvent appelées types définis par l'utilisateur.

Une classe est utilisée pour spécifier la forme d'un objet et combine la représentation des données et les méthodes de manipulation de ces données dans un package soigné. Les données et les méthodes d'une classe sont appelées membres de la classe.

Caractéristique Objective-C

  • La classe est définie dans deux sections différentes à savoir @interface et @implementation.

  • Presque tout est sous forme d'objets.

  • Les objets reçoivent des messages et les objets sont souvent appelés récepteurs.

  • Les objets contiennent des variables d'instance.

  • Les objets et les variables d'instance ont une portée.

  • Les classes masquent l'implémentation d'un objet.

  • Les propriétés sont utilisées pour fournir un accès aux variables d'instance de classe dans d'autres classes.

Définitions des classes Objective-C

Lorsque vous définissez une classe, vous définissez un plan pour un type de données. Cela ne définit en fait aucune donnée, mais définit ce que signifie le nom de la classe, c'est-à-dire en quoi consistera un objet de la classe et quelles opérations peuvent être effectuées sur un tel objet.

Une définition de classe commence par le mot-clé @interfacesuivi du nom de l'interface (classe); et le corps de la classe, entouré par une paire d'accolades. En Objective-C, toutes les classes sont dérivées de la classe de base appeléeNSObject. C'est la superclasse de toutes les classes Objective-C. Il fournit des méthodes de base telles que l'allocation de mémoire et l'initialisation. Par exemple, nous avons défini le type de données Box à l'aide du mot-cléclass comme suit -

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

@end

Les variables d'instance sont privées et ne sont accessibles que dans l'implémentation de la classe.

Allocation et initialisation d'objets Objective-C

Une classe fournit les plans pour les objets, donc fondamentalement un objet est créé à partir d'une classe. Nous déclarons les objets d'une classe avec exactement le même type de déclaration que nous déclarons des variables de types de base. Les instructions suivantes déclarent deux objets de la classe Box -

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

Les deux objets box1 et box2 auront leur propre copie des données membres.

Accès aux données membres

Les propriétés des objets d'une classe sont accessibles à l'aide de l'opérateur d'accès direct aux membres (.). Essayons l'exemple suivant pour clarifier les choses -

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

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

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

Propriétés

Les propriétés sont introduites dans Objective-C pour garantir que la variable d'instance de la classe est accessible en dehors de la classe.

Les différentes parties de la déclaration de propriété sont les suivantes.
  • Les propriétés commencent par @property, qui est un mot-clé

  • Il est suivi de spécificateurs d'accès, qui sont non atomiques ou atomiques, en lecture-écriture ou en lecture seule et forts, unsafe_unretained ou faibles. Cela varie en fonction du type de variable. Pour tout type de pointeur, nous pouvons utiliser strong, unsafe_unretained ou faible. De même pour les autres types, nous pouvons utiliser readwrite ou readonly.

  • Ceci est suivi du type de données de la variable.

  • Enfin, nous avons le nom de la propriété terminé par un point-virgule.

  • Nous pouvons ajouter une instruction synthesize dans la classe d'implémentation. Mais dans le dernier XCode, la partie synthèse est prise en charge par le XCode et vous n'avez pas besoin d'inclure l'instruction synthesize.

Il n'est possible qu'avec les propriétés, nous pouvons accéder aux variables d'instance de la classe. En fait, des méthodes getter et setter en interne sont créées pour les propriétés.

Par exemple, supposons que nous ayons une propriété @property (nonatomic ,readonly ) BOOL isDone. Sous le capot, il y a des setters et des getters créés comme indiqué ci-dessous.

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