Solución:
Como han dicho la mayoría de las otras respuestas, los métodos de instancia usan una instancia de una clase, mientras que un método de clase se puede usar solo con el nombre de la clase. En Objective-C se definen así:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Entonces podrían usarse así:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
Algunos ejemplos del mundo real de métodos de clase son los métodos de conveniencia en muchas clases de Foundation como NSString
‘s +stringWithFormat:
o NSArray
‘s +arrayWithArray:
. Un método de instancia sería NSArray
‘s -count
método.
Todos los detalles técnicos se han cubierto muy bien en las otras respuestas. Solo quiero compartir una analogía simple que creo que ilustra muy bien la diferencia entre una clase y una instancia:
A clase es como el Plano de una casa: solo tiene un plano y (generalmente) no puede hacer tanto con el plano solo.
Un ejemplo (o un objeto) es el real casa que construye basándose en el plano: puede construir muchas casas a partir del mismo plano. Luego puede pintar las paredes de un color diferente en cada una de las casas, al igual que puede cambiar de forma independiente las propiedades de cada instancia de una clase sin afectar las otras instancias.
Como han dicho las otras respuestas, los métodos de instancia operan en un objeto y tienen acceso a sus variables de instancia, mientras que un método de clase opera en una clase como un todo y no tiene acceso a las variables de una instancia en particular (a menos que pase la instancia como un parámetro).
Un buen ejemplo de un método de clase es un método de tipo contador, que devuelve el número total de instancias de una clase. Los métodos de clase comienzan con un +
, mientras que las de instancia comienzan con un -
. Por ejemplo:
static int numberOfPeople = 0;
@interface MNPerson : NSObject {
int age; //instance variable
}
+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end
@implementation MNPerson
- (id)init{
if (self = [super init]){
numberOfPeople++;
age = 0;
}
return self;
}
+ (int)population{
return numberOfPeople;
}
- (int)age{
return age;
}
@end
main.m:
MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);
Salida: Edad: 0 Número de personas: 2
Otro ejemplo es si tiene un método que desea que el usuario pueda llamar, a veces es bueno convertirlo en un método de clase. Por ejemplo, si tiene una clase llamada MathFunctions, puede hacer esto:
+ (int)square:(int)num{
return num * num;
}
Entonces el usuario llamaría:
[MathFunctions square:34];
¡sin tener que crear una instancia de la clase!
También puede usar funciones de clase para devolver objetos liberados automáticamente, como NSArray’s
+ (NSArray *)arrayWithObject:(id)object
Eso toma un objeto, lo coloca en una matriz y devuelve una versión liberada automáticamente de la matriz que no tiene que ser administrada en memoria, ideal para matrices temporales y otras cosas.
¡Espero que ahora entiendas cuándo y / o por qué deberías usar métodos de clase!