Respostas:
Como a maioria das outras respostas já disse, os métodos de instância usam uma instância de uma classe, enquanto um método de classe pode ser usado apenas com o nome da classe. No Objetivo-C, eles são definidos assim:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Eles poderiam ser usados assim:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
Alguns exemplos reais de métodos de classe são os métodos de conveniência em muitas classes do Foundation, como NSString
's ' +stringWithFormat:
ou NSArray
's +arrayWithArray:
. Um método de instância seria NSArray
o -count
método de.
Todos os detalhes técnicos foram bem abordados nas outras respostas. Eu só quero compartilhar uma analogia simples que eu acho que ilustra bem a diferença entre uma classe e uma instância:
Uma classe é como a planta de uma casa: você só tem uma planta e (geralmente) não pode fazer muito isso apenas com a planta.
Uma instância (ou um objeto ) é a casa real que você constrói com base no blueprint: Você pode construir muitas casas a partir do mesmo blueprint. Em seguida, você pode pintar as paredes com uma cor diferente em cada uma das casas, assim como alterar independentemente as propriedades de cada instância de uma classe sem afetar as outras instâncias.
difference between class method and an instance method
;
Como as outras respostas disseram, os métodos de instância operam em um objeto e têm acesso a suas variáveis de instância, enquanto um método de classe opera em uma classe como um todo e não tem acesso às variáveis de uma instância específica (a menos que você passe a instância como um parâmetro).
Um bom exemplo de um método de classe é um método do tipo contador, que retorna o número total de instâncias de uma classe. Os métodos de classe começam com a +
, enquanto os da instância começam com um -
. Por exemplo:
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]);
Saída: Idade: 0 Número de pessoas: 2
Outro exemplo é se você possui um método que deseja que o usuário possa chamar, às vezes é bom torná-lo um método de classe. Por exemplo, se você tiver uma classe chamada MathFunctions, poderá fazer o seguinte:
+ (int)square:(int)num{
return num * num;
}
Então o usuário ligaria para:
[MathFunctions square:34];
sem precisar instanciar a classe!
Você também pode usar funções de classe para retornar objetos liberados automaticamente, como o NSArray
+ (NSArray *)arrayWithObject:(id)object
Isso pega um objeto, coloca-o em uma matriz e retorna uma versão liberada automaticamente da matriz que não precisa ser gerenciada por memória, excelente para matrizes temperamentais e outras coisas.
Espero que agora você entenda quando e / ou por que você deve usar métodos de classe!
Um método de instância se aplica a uma instância da classe (ou seja, um objeto) enquanto um método de classe se aplica à própria classe.
No C #, um método de classe é marcado como estático. Métodos e propriedades não marcadas como estáticas são métodos de instância.
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
A resposta para sua pergunta não é específica para o objetivo-c; no entanto, em diferentes idiomas, os métodos de classe podem ser chamados de métodos estáticos.
A diferença entre métodos de classe e métodos de instância é
Métodos de classe
Métodos de instância
Eu acho que a melhor maneira de entender isso é olhar alloc
einit
. Foi essa explicação que me permitiu entender as diferenças.
Método de classe
Um método de classe é aplicado à classe como um todo. Se você verificar o alloc
método, esse é um método de classe indicado pelo+
declaração anterior à método. É um método de classe porque é aplicado à classe para criar uma instância específica dessa classe.
Método de instância
Você usa um método de instância para modificar uma instância específica de uma classe que é exclusiva para essa instância, e não para a classe como um todo. init
por exemplo (indicado com a -
antes da declaração do método), é um método de instância porque você normalmente está modificando as propriedades dessa classe depois que ela foi criada alloc
.
Exemplo
NSString *myString = [NSString alloc];
Você está chamando o método de classe alloc
para gerar uma instância dessa classe. Observe como o destinatário da mensagem é uma classe.
[myString initWithFormat:@"Hope this answer helps someone"];
Você está modificando a instância de NSString
chamada myString
definindo algumas propriedades nessa instância. Observe como o destinatário da mensagem é uma instância (objeto de classe NSString
).
alloc
aloca memória suficiente para o objeto, init
modificará o conteúdo desses endereços de memória para definir o estado do objeto. Não podemos modificar um objeto a menos que haja um espaço para modificá-lo; portanto, usamos alloc
na classe que decidirá nos dar esse espaço.
Os métodos de classe geralmente são usados para criar instâncias dessa classe
Por exemplo, [NSString stringWithFormat:@"SomeParameter"];
retorna uma NSString
instância com o parâmetro que é enviado a ela. Portanto, por ser um método Class que retorna um objeto de seu tipo, também é chamado de método de conveniência.
Então, se eu entendi direito.
Um class
método não precisa que você aloque uma instância desse objeto para usá-lo / processá-lo. Um class
método é independente e pode operar sem nenhuma dependência do estado de qualquer objeto dessa classe. class
Espera-se que um método aloque memória para todo o seu próprio trabalho e desaloque quando concluído, pois nenhuma instância dessa classe poderá liberar qualquer memória alocada em chamadas anteriores para o método da classe.
UMA instance
método é exatamente o oposto. Você não pode chamá-lo, a menos que aloque uma instância dessa classe. É como uma classe normal que tem um construtor e pode ter um destruidor (que limpa toda a memória alocada).
Com maior probabilidade (a menos que você esteja escrevendo uma biblioteca reutilizável, não deve precisar de uma class
variável.
Tomemos, por exemplo, um jogo em que muitos carros são gerados .. cada um pertence à classe CCar. Quando um carro é instanciado, ele faz uma chamada para
[CCar registerCar:self]
Portanto, a classe CCar pode fazer uma lista de todos os CCar instanciados. Digamos que o usuário termine um nível e queira remover todos os carros ... você pode: 1- Navegar por uma lista de todos os CCar criados manualmente e fazerwhicheverCar.remove();
ou 2- Adicionar um método removeAllCars ao CCar, o que fará isso para você quando ligar para [CCar removeAllCars]. Ou seja, allCars[n].remove();
Ou, por exemplo, você permite que o usuário especifique um tamanho de fonte padrão para todo o aplicativo, que é carregado e salvo na inicialização. Sem o método da classe, talvez você precise fazer algo como
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
Com o método de classe, você pode se safar [FontHandler getDefaultFontSize]
.
Quanto à função removeVowels, você encontrará que idiomas como C # realmente têm ambos com certos métodos, como toLower ou toUpper.
por exemplo, myString.removeVowels()
e String.removeVowels(myString)
(em ObjC, seria [String removeVowels:myString]
).
Nesse caso, a instância provavelmente chama o método de classe, portanto, ambos estão disponíveis. ie
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
basicamente, myString.toLower()
chama [String toLower:ownValue]
Não existe uma resposta definitiva, mas se você deseja empurrar um método de classe para melhorar seu código, tente e tenha em mente que um método de classe permitirá apenas que você use outros métodos / variáveis de classe.
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 de instância
por outro lado, exige 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 de instância não são declarados como estáticos.
No Objective-C, todos os métodos começam com um caractere "-" ou "+". Exemplo:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
Os caracteres "+" e "-" especificam se um método é um class method
ou uminstance method
respectivamente.
A diferença seria clara se chamarmos esses métodos. Aqui os métodos são declarados emMyClass
.
instance method
requer uma instância da classe:
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
Dentro de MyClass
outros métodos, podemos chamar métodos de instância de MyClass
uso self
:
-(void) someMethod
{
[self instanceMethod];
}
Mas, class methods
deve ser chamado na própria classe:
[MyClass classMethod];
Ou:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
Isso não vai funcionar:
// Error
[myClass classMethod];
// Error
[self classMethod];
Um método de classe normalmente cria uma nova instância da classe ou recupera algumas propriedades globais da classe. Os métodos de classe não operam em uma instância ou têm acesso à variável de instância.
Um método de instância opera em uma instância específica da classe. Por exemplo, o método de acesso que você implementou são todos os métodos de instância. Você os utiliza para definir ou obter as variáveis de instância de um objeto específico.
Para invocar um método de instância, você envia a mensagem para uma instância da classe.
Para invocar um método de classe, você envia a mensagem diretamente para a classe.
Fonte: IOS - Objective-C - Métodos de classe e métodos de instância
Os métodos de classe não podem alterar ou conhecer o valor de qualquer variável de instância. Esse deve ser o critério para saber se um método de instância pode ser um método de classe.
Lembre-se também de que a mesma ideia se aplica a variáveis. Você encontrará termos como estático, membro, instância, classe e assim por diante ao falar sobre variáveis da mesma maneira que faria para métodos / funções.
Parece que o termo comum na comunidade Obj-C é variável por exemplo, mas eu ainda não sou um garoto de Obj-C.
Uma atualização para as respostas acima, concordo que os métodos de instância usam uma instância de uma classe, enquanto um método de classe pode ser usado apenas com o nome da classe.
Não há mais nenhuma diferença entre o método de instância e o método de classe após a contagem automática de referência existir no Objective-C.
Por exemplo, [NS StringWithformat:..]
um método de classe e [[NSString alloc] initwihtformat:..]
um método de instância, ambos são os mesmos após o ARC
Nota: Isso é apenas no formato de pseudo-código
Método de classe
Quase tudo o que precisa fazer é durante o tempo de compilação . Ele não precisa de nenhuma entrada do usuário, nem o cálculo é baseado em uma instância. Tudo sobre isso é baseado na classe / projeto - que é único, ou seja, você não possui vários projetos para uma classe. Você pode ter variações diferentes durante o tempo de compilação? Não, portanto, a classe é única e, portanto, não importa quantas vezes você chame um método de classe, o ponteiro apontando para ele seria o mesmo.
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
Método de instância
Por outro lado, o método da instância ocorre durante o tempo de execução, pois somente então você criou uma instância de algo que pode variar a cada instanciação.
initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.
Se você vem de outros idiomas, os métodos estáticos são iguais aos métodos de classe.
Se você é do Swift, os métodos de tipo são iguais aos métodos de classe.
Adicionando às respostas acima
O método Class funcionará na classe, vamos usá-lo para fins gerais, como + stringWithFormat, tamanho da classe e, o mais importante, para init etc
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
O método de instância funcionará em uma instância de uma classe e não em uma classe como se estivéssemos tendo duas pessoas e queremos conhecer o saldo de cada uma separadamente aqui, precisamos usar o método de instância. Porque não retornará resposta geral. por exemplo, como determinar a contagem de NSSArray etc.
[johnson getAccountBalance];
[ankit getAccountBalance];