2011-04-30 2 views
30

Je suis débutant dans le développement de l'iPhone. J'essayais cet exemple de programme ci-dessous.Constructeur dans l'objectif C

Je n'appelle pas la méthode + (void) initialise et - (id) init dans la classe B.Mais elle est appelée automatiquement.

Est-ce le - (void) est égale à l'initialiser le constructeur par défaut dans l'objectif C.

Est-ce que les points [super init] à la NSObject.

Si je n'utilise pas la méthode - (id) init, je reçois un avertissement indiquant que la classe est incomplète.

ClassA.h

#import <Foundation/Foundation.h> 

static int ab; 

@interface ClassA : NSObject { 
    int a; 
} 

+ (void) initialize; 
- (id) init; 
- (void) displayNumOfInstance; 
- (void) disp; 

@end 

ClassA.m

#import "ClassA.h" 

@implementation ClassA 

+ (void) initialize 
{ 
    ab=0; 
} 

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

- (void) displayNumOfInstance 
{ 
    NSLog(@"Number of instances of this class:%d",ab); 
} 

- (void) disp 
{ 
    NSLog(@"The value is %d",ab); 
} 

@end 

ClassB.h

#import <Foundation/Foundation.h> 
#import "ClassA.h" 

@interface ClassB : ClassA { 

} 

- (void) display; 

@end 

ClassB.m

#import "ClassB.h" 

@implementation ClassB 

- (void) display 
{ 
    ab=20; 
    NSLog(@"The value ab is %d",ab); 
} 

@end 

class2.m

#import <Foundation/Foundation.h> 
#import "ClassA.h" 

int main (int argc, const char * argv[]) { 
    ClassA *a = [[ClassA alloc]init]; 
    [a disp]; 
    [a release]; 

    ClassB *b = [[ClassB alloc]init]; 
    [b display]; 
    [b release]; 

    ClassA *a1 = [[ClassA alloc]init]; 
    [a1 disp]; 
    [a1 release]; 

    ClassB *b1 = [[ClassB alloc]init]; 
    [b1 display]; 
    [b1 release]; 

    return 0; 
} 

Sortie:

2011-04-30 15:31:42.490 class2[1674:a0f] 1 
2011-04-30 15:31:42.493 class2[1674:a0f] The value ab is 20 
2011-04-30 15:31:42.494 class2[1674:a0f] 2 
2011-04-30 15:31:42.495 class2[1674:a0f] The value ab is 20 

Répondre

57

La construction par défaut commence habituellement avec le format suivant -init ou toute variante sur ce, par exemple -initWithFrame:.

La méthode +initialize est une méthode de classe (méthode statique) appelée au moins une fois lorsque votre application démarre. Vous pouvez utiliser cette méthode pour initialiser des variables statiques utiles dans toutes les instances de la classe. Cette méthode pourrait être utile, par ex. initialiser un cache partagé ou une carte de recherche partagée pour une classe.

Pour NSObject la méthode -init est l'initialiseur désigné, mais pour d'autres classes cela peut différer. Apple documente l'initialiseur désigné dans ses en-têtes de classe à l'aide de la macro NS_DESIGNATED_INITIALIZER. Par exemple UIView sous-classes doivent substituer -initWithFrame: et -initWithCoder: à la place, car ces méthodes sont marquées en tant qu'initialisateur désigné.

Lors du sous-classement et de l'implémentation d'un initialiseur personnalisé, n'oubliez pas d'initialiser la super classe. Prenons par exemple une sous-classe UIView dotée d'un initialiseur désigné personnalisé -initWithFrame:title:.Nous mettre en œuvre comme suit:

// A custom designated initializer for an UIView subclass. 
- (id)initWithFrame:(CGRect)frame title:(NSString *)title 
{ 
    // Initialize the superclass first. 
    // 
    // Make sure initialization was successful by making sure 
    // an instance was returned. If initialization fails, e.g. 
    // because we run out of memory, the returned value would 
    // be nil. 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     // Superclass successfully initialized. 
     self.titleLabel.text = title 
    } 
    return self; 
} 

// Override the designated initializer from the superclass to 
// make sure the new designated initializer from this class is 
// used instead. 
- (id)initWithFrame:(CGRect)frame 
{ 
    return [[self alloc] initWithFrame:frame title:@"Untitled"]; 
} 

Plus de détails sur INITIALISATION sont disponibles sur le site Apple Developer: