2011-04-30 7 views
30

soy principiante en iPhone development.I estaba tratando este programa muestra a continuación.Constructor en Objective C

No estoy llamando al + (void) inicializar y - método init (id) en la clase B.But su recibiendo llamadas de forma automática.

¿El - (void) intialise es igual al constructor por defecto en C objetiva

¿Tiene los puntos [Super init] a la NSObject.

Si no estoy usando el método init - (id) recibo una advertencia de que la clase tiene una implementación incompleta.

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

de salida:

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 

Respuesta

57

La construcción predeterminada por lo general comienzan con tiene el siguiente formato -init o cualquier variante en esto, por ejemplo, -initWithFrame:.

El método +initialize es un método de clase (método estático) que se llama al menos una vez cuando se inicia la aplicación. Puede utilizar este método para inicializar variables estáticas que son útiles en todas las instancias de la clase. Este método podría ser útil, por ej. Inicialice un caché compartido o un mapa de búsqueda compartida para una clase.

Para NSObject el método -init es el inicializador designado, pero para otras clases esto puede diferir. Manzana documenta el inicializador designado en ella de las cabeceras de clase utilizando el macro NS_DESIGNATED_INITIALIZER. Por ejemplo, las subclases UIView deben reemplazar -initWithFrame: y -initWithCoder:, ya que estos métodos están marcados como inicializadores designados.

Al crear subclases e implementar un inicializador designado personalizado, no olvide inicializar la superclase también. Vamos a por ejemplo, tienen una subclase UIView que tiene un inicializador designado encargo -initWithFrame:title:.Nos gustaría ponerlo en práctica de la siguiente manera:

// 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"]; 
} 

Más detalles sobre Inicializando se pueden encontrar en el sitio web de Apple Desarrollador: