Respostas:
+
é 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".
Há outra pergunta que trata da diferença entre métodos de classe e instância .
@classmethod
e mais @method
ou menos também. Por que tão conciso ...?
(+) 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];
+ 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.
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; }
A explicação definitiva sobre isso da Apple está aqui, na seção 'Métodos e mensagens':
Em resumo:
(o método pode ser chamado sem que uma instância da classe seja instanciada). Então você chama assim:
[className classMethod];
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";