Respuestas:
+
es para un método de clase y -
es para un método de instancia.
P.ej
// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end
// somewhere else:
id myArray = [NSArray array]; // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4]; // here the message is sent to myArray
// Btw, in production code one uses "NSArray *myArray" instead of only "id".
Hay otra pregunta sobre la diferencia entre los métodos de clase e instancia .
@classmethod
y @method
más o menos, también. ¿Por qué tan breve ...?
(+) para métodos de clase y (-) por ejemplo, método,
(+) Métodos de clase: -
Son métodos que se declaran como estáticos. Se puede llamar al método sin crear una instancia de la clase. Los métodos de clase solo pueden funcionar en los miembros de la clase y no en los miembros de la instancia, ya que los métodos de la clase desconocen a los miembros de la instancia. Los métodos de instancia de la clase tampoco se pueden invocar desde un método de clase a menos que se invoquen en una instancia de esa clase.
(-) Métodos de instancia: -
Por otro lado, es necesario que exista una instancia de la clase antes de que se pueda invocar, por lo que se debe crear una instancia de una clase utilizando la nueva palabra clave. Los métodos de instancia operan en instancias específicas de clases. Los métodos de instancia no se declaran como estáticos.
¿Como crear?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
¿Cómo utilizar?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
Los métodos + son métodos de clase, es decir, métodos que no tienen acceso a las propiedades de una instancia. Se utiliza para métodos como alloc o métodos auxiliares para la clase que no requieren acceso a variables de instancia
- los métodos son métodos de instancia: se relacionan con una sola instancia de un objeto. Usualmente se usa para la mayoría de los métodos en una clase.
Consulte la Especificación del idioma para más detalles.
self
, sino la clase. Simplemente no están asociados con una instancia, y la búsqueda de métodos no es a través de la instancia, sino a través de la clase. Aún así, podrías hacerlo+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
La explicación definitiva de esto de Apple está aquí, en la sección 'Métodos y mensajería':
En breve:
(Se puede llamar al método sin una instancia de la clase que se está instanciando). Entonces lo llamas así:
[className classMethod];
Primero debe crear una instancia de un objeto, luego puede llamar al método en el objeto). Puede crear una instancia manual de un objeto como este:
SomeClass* myInstance = [[SomeClass alloc] init];
(Esto esencialmente asigna espacio de memoria para el objeto y luego lo inicializa en ese espacio, una simplificación excesiva pero una buena manera de pensarlo. Puede asignar e iniciar el objeto por separado pero nunca hacer esto , puede conducir a problemas desagradables relacionados con los punteros y gestión de memoria)
Luego llame al método de instancia:
[myInstance instanceMethod]
Una forma alternativa de obtener una instancia de un objeto en el Objetivo C es así:
NSNumber *myNumber = [NSNumber numberWithInt:123];
que llama al método de clase 'numberWithInt' de la clase NSNumber, que es un método de 'fábrica' (es decir, un método que le proporciona una 'instancia preparada' de un objeto).
El objetivo C también permite la creación de ciertas instancias de objetos directamente usando una sintaxis especial, como en el caso de una cadena como esta:
NSString * myStringInstance = @ "abc";