2010-06-30 25 views

Respuesta

12

Usando el viejo y cansado analogía del coche ...

Piense en una clase como si fuera una fábrica de instancias de la clase. Por ejemplo, es posible que tenga una clase de coches y es posible declarar un método como:

+ carWithColor: (NSColor *) aColor; 

Y ese método sería entonces crear una nueva instancia de coches, establecer el color, y devolverlo:

+ carWithColor: (NSColor *) aColor 
{ 
    Car *aCar = [[[self alloc] init] autorelease]; 
    [aCar paintWithColor: aColor]; 
    return aCar; 
} 

Ahora, esa clase de Auto declararía un método de instancia que permite pintar el auto. ¿Por qué un método de instancia? Porque cada automóvil puede tener un color diferente (y el color del auto probablemente se almacena en una variable de instancia).

- (void) paintWithColor: (NSColor *) aColor 
{ 
    ... do your paint stuff here ... 
} 

Esto se explica en la sección Objects, Classes, and Messaging de la documentación de Objective-C.

-1

firmas de los métodos de clase tienen el prefijo +, los métodos de instancia con - por lo que en sus declaraciones de archivos de cabecera sería algo como esto:

-(void)setAllThings:(NSArray*)things; //instance method 
+(void)setAllClassThings:(NSArray*)things; //class method 

Y, por supuesto, se aplican las mismas reglas cuando se definen los métodos en el. m archivo.

+0

sé cómo se declaran junto con su sintaxis también. Pero no sé el concepto detrás de por qué tenemos que implementar el método de clase y método de instancia? – Tirth

+1

iHungry, piensa cuando no necesites instanciar un objeto, o establecer getter o setters, y tal vez obtener algo derivado sin realmente inicializar un objeto, entonces los métodos de clase son útiles. Dado que la asignación y la inicialización de los métodos de clase ocurren en segundo plano, puede llamar a un método de clase y obtener retorno de alguna forma, sin inicializar el objeto y pasar por ese doloroso proceso de alloc, init y release. Si observa el encabezado predeterminado de iOS, notará que la mayoría de las veces los métodos de clase le devuelven un objeto. – kforkarim

0

Instancia métodos hacer cosas con casos de una clase:

NSString *myString; 
myString = [[[NSString alloc] initWithString:@"Hello, world."] autorelease]; 
NSLog (@"myString's length: %u", [myString length]); // instance method 

Clase métodos pueden hacer específicas de clase cosas sin depender de una instancia de objeto, a menudo regresar una instancia de la clase, o algún otro resultado específico de clase:

NSLog (@"%@", [NSString stringWithString:@"Hello, world."]); // class method 

I t Creo que puede ser raro ver métodos de clase que no devuelvan algo.

+0

Un ejemplo de método de clase que no devuelve nada es '[UIView + setAnimationsEnabled:]' - es decir, un método de clase puede aplicar cambios a todas las instancias. –

0

No necesita implementar ambos. Cualquiera de las opciones está disponible para usted a medida que diseña su clase.

Un método de instancia puede operar en una instancia de la clase. Esto puede obtener o establecer una propiedad, o causar un comportamiento que solo desea que la instancia realice. Necesitas tener una instancia para usarlo. Estos pueden usar o cambiar el estado de la instancia.

// Notional instance methods 
myHouse.color = blueColor; 

[myCar accelerate]; 
speed = myCar.speed; 

Un método de clase funciona según la noción de que la clase existe. Se puede usar para crear una instancia o realizar un cálculo que no dependa de tener una instancia. Es posible que tenga una clase para ayuda matemática personalizada, que esencialmente contiene funciones.

// Notional class method uses 
myString = [NSString stringWithFormat:@"&f", floatToConvert]; 

myResult = [MyMathHelper MyFunctionWithInput:myInput]; 
6

Esta es una publicación anterior, pero como aparece primero en una búsqueda de Google, pensé que me gustaría agregarla.

No voy a hablar sobre los métodos de clase utilizados como métodos de fábrica. Me gustaría hablar sobre su uso en métodos de utilidad.Puede/debe usar métodos de clase para métodos de utilidad que son independientes del estado. ¿Qué significa esto? Bueno, por ejemplo, si está formateando una fecha de la misma manera para todas las instancias, ese es un método de utilidad que debería ser un método de clase. Piense en el método de utilidad como un destornillador. No necesita hacer una nueva instancia del destornillador cada vez que quiera hacer algo con él. El destornillador permanece constante. Entonces, por ejemplo, tengo una clase que incluye un método privado que genera una cadena de emDash usadas para mostrar a la vista. Este método no depende del estado y, por lo tanto, no variará según la instancia. Piense en métodos de utilidad de clase como constantes.

+ (NSString *)emDashString { 
return @" \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014"; 

}

Puede llamar a este método de forma genérica dentro de la clase (que es privado en mi ejemplo) así:

NSString *string = [[self class] emDashString ]; 

he elegido deliberadamente un poco de un ejemplo trivial maneja el punto a casa. Usted solo se molestaría en hacer de este un método de utilidad de clase si va a necesitar esta cadena más de una vez en su clase. Tenga en cuenta que, en lugar de referirme a la clase por su nombre, la llamo genéricamente con [self class] ya que esto se llama internamente. Si está expuesto y desea llamarlo desde otra clase, hágalo por el nombre de la clase, como de costumbre.

+0

Me gusta esta explicación mejor que la idea de fábrica. Después de todo, se puede crear una instancia de coche usando: Car * car = [[Car alloc] init]; Y luego pintado con otro método de instancia, por lo que realmente no veo la analogía de Fábrica como muy útil. Pero la idea de estado/sin estado es muy útil y usa métodos de clase para devolver valores que son constantes. Excelente explicación. –

+0

Y supongo que hay menos sobrecarga al llamar a un método de clase, por lo que es importante entender cuándo usarlos. –

Cuestiones relacionadas