O que significam os sinais de mais e menos no Objective-C ao lado de um método?

180

No Objective-C, eu gostaria de saber o que significam os sinais +e -ao lado de uma definição de método.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
Gyurisc
fonte

Respostas:

226

+é para um método de classe e -é para um método de instância.

Por exemplo

// 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".

outra pergunta que trata da diferença entre métodos de classe e instância .

Georg Schölly
fonte
63
É quase como se os cinco caracteres extras de "estático" fossem demais para eles.
Anon.
23
@ Anon: Os métodos não são estáticos. Eles são métodos de classe. Eles podem ser substituídos e fazem parte da hierarquia de classes. estática implica algo muito diferente em C.
bbum
4
@Avon, isso é uma maçã para você, eles também deixam um flash na câmera e um botão direito no mouse. =)
pokstad
13
@bbum está no dinheiro. O fato de o Java reapropriar a palavra-chave "estática" para significar algo diferente não é culpa do muito mais antigo C. Embora seu uso possa não ser totalmente intuitivo em C, parece ainda menos em Java. Eu esperaria que a estática seja o oposto da dinâmica - algo que não muda. E, claro, a linguagem Objective-C foi em torno de quase 15 anos antes de a Apple adotou no OS X.
Quinn Taylor
3
A diferença entre o método estático e o de classe: Defina o método + foo em MYBaseClass e sua subclasse MYSubClass. NSArray * classes = @ [[classe MYBaseClass], [classe MYSubClass]]; [classes makeObjectsPerformSelector: @selector (foo)]; Não funcionaria com um método estático. Dito isto, eu preferiria um @classmethode mais @methodou menos também. Por que tão conciso ...?
uliwitness
45

(+) para métodos de classe e (-) por exemplo, método,

(+) Métodos de classe: -

São métodos declarados como estáticos. O método pode ser chamado sem criar uma instância da classe. Os métodos de classe podem operar apenas em membros da classe e não em membros da instância, pois os métodos da classe desconhecem os membros da instância. Os métodos de instância da classe também não podem ser chamados de dentro de um método de classe, a menos que estejam sendo chamados em uma instância dessa classe.

(-) Métodos da instância: -

Por outro lado, exija que uma instância da classe exista antes de poder ser chamada, portanto, é necessário criar uma instância de uma classe usando a nova palavra-chave. Os métodos de instância operam em instâncias específicas de classes. Os métodos da instância não são declarados como estáticos.

Como criar?

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

Como usar?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
Vandit Mehta
fonte
18

+ métodos são métodos de classe - ou seja, métodos que não têm acesso às propriedades de uma instância. Usado para métodos como métodos de alocação ou auxiliar para a classe que não requerem acesso a variáveis ​​de instância

- métodos são métodos de instância - estão relacionados a uma única instância de um objeto. Geralmente usado para a maioria dos métodos em uma classe.

Consulte a especificação de idioma para obter mais detalhes.

Robert Christie
fonte
Bem, na verdade, os métodos de classe têm acesso a variáveis ​​de instância, eles simplesmente não têm uma instância como self, mas sim a classe. Eles simplesmente não estão associados a uma instância, e a pesquisa de métodos não é através da instância, mas através da classe. Ainda assim, você poderia fazer+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness
5

A explicação definitiva sobre isso da Apple está aqui, na seção 'Métodos e mensagens':

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

Em resumo:

+ significa 'método de classe'

(o método pode ser chamado sem que uma instância da classe seja instanciada). Então você chama assim:

[className classMethod]; 


- significa 'método da instância'

Você precisa instanciar um objeto primeiro e depois chamar o método no objeto). Você pode instanciar manualmente um objeto como este:

SomeClass* myInstance = [[SomeClass alloc] init];

(isso essencialmente aloca espaço de memória para o objeto e, em seguida, inicializa o objeto nesse espaço - uma simplificação excessiva, mas é uma boa maneira de pensar sobre isso. Você pode alocar e iniciar o objeto separadamente, mas nunca faz isso - pode levar a problemas desagradáveis ​​relacionados a ponteiros e gerenciamento de memória)

Em seguida, chame o método da instância:

[myInstance instanceMethod]

Uma maneira alternativa de obter uma instância de um objeto no Objective C é assim:

NSNumber *myNumber = [NSNumber numberWithInt:123];

que está chamando o método da classe 'numberWithInt' da classe NSNumber , que é um método de 'fábrica' (ou seja, um método que fornece uma 'instância pronta' de um objeto).

O objetivo C também permite a criação de determinadas instâncias de objeto diretamente usando sintaxe especial, como no caso de uma string como esta:

NSString * myStringInstance = @ "abc";

Chris Halcrow
fonte