49 votes

Ajouter un initWith personnalisé?

Si je crée un initWith personnalisé pour un objet, est-ce que j'inclus essentiellement le code que j'ajouterais si je veux remplacer init?

 -(id) init {
    self = [super init];
    if (self) {
        NSLog(@"_init: %@", self);
    }
    return(self);
}
 

par exemple

 -(id) initWithX:(int) inPosX andY:(int) inPosY {
    self = [super init];
    if(self) {
        NSLog(@"_init: %@", self);
        posX = inPosX;
        posY = inPosY;
    }
    return(self);
}
 

gary

94voto

stefanB Points 27796

Vous pouvez créer un désigné d'initialiseur qui accepte tous les paramètres que vous souhaitez rendre disponibles lors de l'initialisation.

Vous pouvez ensuite appeler à partir de votre autre -(id)init votre désignée d'initialiseur avec les paramètres appropriés.

Seulement désigné initialiseur d'initialiser super classe [super init].

Exemple:

- (id)init
{
    return [self initWithX:defaultX andY:defaultY];
}

- (id)initWithPosition:(NSPoint)position
{
    return [self initWithX:position.x andY:position.y];
}


- (id)initWithX:(int)inPosX andY:(int)inPosY
{
    self = [super init];
    if(self) {
        NSLog(@"_init: %@", self);
        posX = inPosX;
        posY = inPosY;
    }
    return self;
}

Désignés initialiseur est - -(id)initWithX:andY: et vous l'appeler à partir d'autres initialiseurs.

Dans le cas où vous souhaitez étendre cette classe, vous appelez votre désignée d'initialiseur de la sous-classe.

10voto

dbachrach Points 311

Je suggère de créer un initialiseur principal qui gère la plupart du travail. Vous pouvez ensuite créer un nombre quelconque d'autres initialiseurs qui appellent tous celui-ci principal. L'avantage de ceci est que si vous voulez changer le processus d'initialisation, vous n'aurez qu'à changer un seul endroit (en général). Cela pourrait ressembler à ceci:

 -(id) initWithX:(float)x {
    if (self = [super init]) {
        /* do most of initialization */
        self.xVal = x;
    }
    return(self);
}

-(id) init {
    return [self initWithX:0.0f];
}
 

Dans cet exemple, initWithX: est notre principal initialiseur. L'autre initialiseur (init) appelle simplement initWithX: avec une valeur par défaut (dans ce cas 0).

6voto

Benjamin Cox Points 4121

Oui, c'est exactement comme ça que je le fais. Un léger changement supprimera une ligne de code:

  if (self = [super init]) {
 

Par opposition à:

  self = [super init];
 if(self) {
 

2voto

dreamlax Points 47152

Parfois, vous souhaitez réutiliser du code d'initialisation et modifier légèrement le comportement pour des initialiseurs spécifiques. Dans ce cas, je fais ce qui suit:

 
- (id) init
{
    self = [super init];
    if (!self) return nil;

    // These values are always initialised this way
    ivar1 = 10;
    ivar2 = @"HellO";
    ivar3 = [[NSMutableArray alloc] initWithCapacity:10];
    ivar4 = 22;

    return self;
}

- (id) initWithIvar4:(int) aValue
{
    // call -init on self, which will call -init on super for us, and set
    // up ivar1, ivar2, ivar3, and ivar4.
    self = [self init];
    if (!self) return nil;

    // Change ivar4 from the default 22 to whatever aValue is.
    ivar4 = aValue;

    return self;
}

 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X