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];


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow