2011-08-12 14 views
19

Estoy intentando agregar un constructor de conveniencia a mi objeto personalizado. Similar a [NSArray arrayWithArray:]Cómo escribir un constructor de conveniencia Objective-C

Sé que se trata de un método de clase que devuelve un objeto liberado automáticamente. He estado buscando en Google, pero todo lo que puedo encontrar es la definición de un constructor de conveniencia, pero no cómo escribir uno.

Respuesta

33

Digamos que usted tiene lo siguiente:

@class PotatoPeeler : NSObject 
- (instancetype)initWithWidget: (Widget *)w; 
@end 

continuación para añadir un método de fábrica, que le cambia a esto:

@class PotatoPeeler : NSObject 
+ (instancetype)potatoPeelerWithWidget: (Widget *)w; 
- (instancetype)initWithWidget: (Widget *)w; 
@end 

y su aplicación sería simplemente:

+ (instancetype)potatoPeelerWithWidget: (Widget *)w { 
    return [[[self alloc] initWithWidget: w] autorelease]; 
} 

Editar: reemplazado id con instancetype. Son funcionalmente idénticos, pero el último proporciona mejores pistas al compilador sobre el tipo de devolución del método.

+12

+1 nota el uso 'self' en lugar del nombre de la clase no modificable a alloc-init la instancia con el fin de manejar adecuadamente la subclasificación ** ** (' self' aquí se refiere a la clase el objeto mismo). También tenga en cuenta el tipo de devolución 'id': [" El tipo de devolución de los constructores de conveniencia es id por la misma razón que es id para los métodos de inicialización "] (http://developer.apple.com/library/mac/documentation/Cocoa/ Conceptual/ObjectiveC/Chapters/ocAllocInit.html # // apple_ref/doc/uid/TP30001163-CH22-SW12) – albertamg

+0

@albertamg: Exactamente a la derecha. :) –

+1

Esperemos que google lo indexe esta vez;) –

-4
-(MYClass*) myInit{ 
    self = [super init]; 

    /* Your code */ 

    return self; 
} 

Suponiendo que deriva su clase de NSObject.

Simplemente dele los parámetros que quiera pasar al constructor.

4

Generalmente mi enfoque es el siguiente: primero creo un método de inicialización normal (método de instancia), luego creo un método de clase que llama al inicializador normal. Me parece que Apple usa el mismo enfoque la mayor parte del tiempo. Un ejemplo:

@implementation SomeObject 

@synthesize string = _string; // assuming there's an 'string' property in the header 

- (id)initWithString:(NSString *)string 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.string = string; 
    } 
    return self; 
} 

+ (SomeObject *)someObjectWithString:(NSString *)string 
{ 
    return [[[SomeObject alloc] initWithString:string] autorelease]; 
} 

- (void)dealloc 
{ 
    self.string = nil; 

    [super dealloc]; 
} 

@end 
Cuestiones relacionadas