Objective-C Language
Classes et Objets
Recherche…
Syntaxe
- Cat * cat = [[Cat alloc] init]; // Créer un objet chat de type Cat
- Dog * dog = [[Dog alloc] init]; // Créer un objet chien de type Chien
- NSObject * someObject = [NSObject alloc]; [someObject init]; // ne fais pas ça
- XYZObject * object = [XYZObject new]; // Utilise new pour créer des objets si AUCUN argument n'est requis pour l'initialisation
- NSString * someString = @ "Bonjour, Monde!"; // Créer un NSString avec une syntaxe littérale
- NSNumber * myFloat = @ 3.14f; // Un autre exemple pour créer un NSNumber en utilisant une syntaxe littérale
- NSNumber * myInt = @ (84/2); // Crée un objet en utilisant une expression encadrée
Création de classes avec des valeurs d'initialisation
#import <Foundation/Foundation.h>
@interface Car:NSObject {
NSString *CarMotorCode;
NSString *CarChassisCode;
}
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode;
- (void) startCar;
- (void) stopCar;
@end
@implementation Car
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode{
CarMotorCode = motorCode;
CarChassisCode = chassisCode;
return self;
}
- (void) startCar {...}
- (void) stopCar {...}
@end
La méthode initWithMotorValue: type andChassisValue: type
sera utilisée pour initialiser les objets Car.
Classe Singleton
Qu'est-ce qu'une classe Singleton?
Une classe singleton renvoie la même instance, quel que soit le nombre de fois qu'une application le demande. Contrairement à une classe régulière, un objet singleton fournit un point d'accès global aux ressources de sa classe.
Quand utiliser les classes Singleton?
Les singletons sont utilisés dans des situations où ce point de contrôle unique est souhaitable, par exemple avec des classes offrant des services généraux ou des ressources.
Comment créer des classes Singleton
Tout d'abord, créez un nouveau fichier et sous-classez-le à partir de NSObject
. Nommez-le, nous utiliserons CommonClass
ici. Xcode va maintenant générer des fichiers CommonClass.h et CommonClass.m pour vous.
Dans votre fichier CommonClass.h
:
#import <Foundation/Foundation.h>
@interface CommonClass : NSObject {
}
+ (CommonClass *)sharedObject;
@property NSString *commonString;
@end
Dans votre fichier CommonClass.m
:
#import "CommonClass.h"
@implementation CommonClass
+ (CommonClass *)sharedObject {
static CommonClass *sharedClass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClass = [[self alloc] init];
});
return sharedClass;
}
- (id)init {
if (self = [super init]) {
self.commonString = @"this is string";
}
return self;
}
@end
Comment utiliser les classes Singleton
La classe Singleton que nous avons créée précédemment sera accessible de n'importe où dans le projet tant que vous avez importé le fichier CommonClass.h
dans le module concerné. Pour modifier et accéder aux données partagées dans la classe Singleton, vous devrez accéder à l'objet partagé de cette classe accessible à l'aide de la méthode sharedObject
, comme suit:
[CommonClass sharedObject]
Pour lire ou modifier les éléments de la classe partagée, procédez comme suit:
NSString *commonString = [[CommonClass sharedObject].commonString; //Read the string in singleton class
NSString *newString = @"New String";
[CommonClass sharedObject].commonString = newString;//Modified the string in singleton class
Le type de retour "instancetype"
Objective-C prend en charge un type spécial appelé `instancetype qui ne peut être utilisé que comme type renvoyé par une méthode. Il évalue à la classe de l'objet récepteur.
Considérons la hiérarchie de classes suivante:
@interface Foo : NSObject
- (instancetype)initWithString:(NSString *)string;
@end
@interface Bar : Foo
@end
Lorsque [[Foo alloc] initWithString:@"abc"]
est appelé, le compilateur peut en déduire que le type de retour est Foo *
. La classe Bar
dérivée de Foo
mais n'a pas remplacé la déclaration de l'initialiseur. Cependant, grâce à instancetype
, le compilateur peut déduire que [[Bar alloc] initWithString:@"xyz"]
renvoie une valeur de type Bar *
.
Considérez le type de retour de -[Foo initWithString:]
étant à la place Foo *
: si vous appelez [[Bar alloc] initWithString:]
, le compilateur en [[Bar alloc] initWithString:]
qu’un Foo *
est renvoyé, et non une Bar *
développeur. Le type d' instancetype
résolu ce problème.
Avant l'introduction de l' instancetype
, les initialiseurs, les méthodes statiques telles que les accesseurs singleton et les autres méthodes souhaitant renvoyer une instance de la classe réceptrice devaient renvoyer un id
. Le problème est que id
signifie "un objet de tout type" . Le compilateur ne peut donc pas détecter que NSString *wrong = [[Foo alloc] initWithString:@"abc"];
attribue une variable avec un type incorrect.
En raison de ce problème, les initialiseurs doivent toujours utiliser instancetype
au lieu de id
comme valeur de retour.
Spécification de génériques
Vous pouvez améliorer vos propres classes avec des génériques comme NSArray
ou NSDictionary
.
@interface MyClass<__covariant T>
@property (nonnull, nonatomic, strong, readonly) NSArray<T>* allObjects;
- (void) addObject:(nonnull T)obj;
@end
Différence entre allocation et initialisation
Dans la plupart des langages orientés objet, l'allocation de mémoire pour un objet et son initialisation est une opération atomique:
// Both allocates memory and calls the constructor
MyClass object = new MyClass();
En Objective-C, ce sont des opérations distinctes. Les méthodes de classe alloc
(et son frère historique allocWithZone:
font que le runtime Objective-C réserve la mémoire requise et l'efface. À l'exception de quelques valeurs internes, toutes les propriétés et variables sont définies sur 0 / NO
/ nil
.
L'objet est alors déjà "valide" mais nous voulons toujours appeler une méthode pour configurer réellement l'objet, que nous appelons un initialiseur . Celles-ci servent le même objectif que les constructeurs dans d'autres langues. Par convention, ces méthodes commencent par init
. Du point de vue du langage, ce ne sont que des méthodes normales.
// Allocate memory and set all properties and variables to 0/NO/nil.
MyClass *object = [MyClass alloc];
// Initialize the object.
object = [object init];
// Shorthand:
object = [[MyClass alloc] init];