¿Qué significan los signos más y menos en Objective-C junto a un método?

180

En Objective-C, me gustaría saber qué significan los signos +y -junto a una definición de método.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
gyurisc
fuente

Respuestas:

226

+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 .

Georg Schölly
fuente
63
Es casi como si los cinco caracteres adicionales de "estática" fueran de alguna manera demasiado para ellos.
Anon
23
@Anon: Los métodos no son estáticos. Son métodos de clase. Se pueden anular y forman parte de la jerarquía de clases. estática implica algo muy diferente en C.
bbum
44
@ Avon, eso es manzana para ti, también dejarán un flash en su cámara y un botón derecho en sus ratones. =)
pokstad
13
@bbum está en el dinero. El hecho de que Java se haya apropiado de la palabra clave "estática" para que signifique algo diferente no es culpa del C. mucho más antiguo. Si bien su uso puede no ser completamente intuitivo en C, parece menos aún en Java. Esperaría que la estática sea lo opuesto a la dinámica, algo que no cambia. Y, por supuesto, el lenguaje Objective-C existió durante casi 15 años antes de que Apple lo adoptara en OS X.
Quinn Taylor,
3
La diferencia entre el método estático y el de clase: defina el método + foo en MYBaseClass y su subclase MYSubClass. NSArray * classes = @ [[clase MYBaseClass], [clase MYSubClass]]; [clases makeObjectsPerformSelector: @selector (foo)]; No funcionaría con un método estático. Dicho esto, yo prefiero un would'a @classmethody @methodmás o menos, también. ¿Por qué tan breve ...?
uliwitness
45

(+) 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];
Vandit Mehta
fuente
18

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.

Robert Christie
fuente
Bueno, en realidad los métodos de clase tienen acceso a variables de instancia, simplemente no tienen una instancia como 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; }
uliwitness
5

La explicación definitiva de esto de Apple está aquí, en la sección 'Métodos y mensajería':

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

En breve:

+ significa 'método de clase'

(Se puede llamar al método sin una instancia de la clase que se está instanciando). Entonces lo llamas así:

[className classMethod]; 


- significa 'método de instancia'

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

Chris Halcrow
fuente