Pergunta

Qual é a diferença entre um método de classe e um método de instância?

São métodos de instância os acessores (getters e setters), enquanto os métodos de classe são praticamente tudo o mais?

Foi útil?

Solução

Como a maioria das outras respostas já disse, métodos de instância usar uma instância de uma classe, enquanto que um método da classe pode ser usado com apenas o nome da classe.Em objective-C são definidas assim:

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

Eles poderiam, então, ser usado assim:

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

Alguns exemplos do mundo real de métodos de classe são os métodos de conveniência em muitos Foundation classes como NSString's +stringWithFormat: ou NSArray's +arrayWithArray:.Um método de instância seria NSArray's -count o método.

Outras dicas

Todos os detalhes técnicos foram bem abordados nas outras respostas. Eu só quero compartilhar uma analogia simples que acho que ilustra bem a diferença entre uma classe e uma instância:

enter image description here

UMA classe é como o Blueprint de uma casa: você tem apenas um plano e (geralmente) você não pode fazer muito com o plano sozinho.

enter image description here

Um instância (ou um objeto) é o real lar que você constrói com base no plano: você pode construir muitas casas a partir do mesmo plano. Em seguida, você pode pintar as paredes uma cor diferente em cada uma das casas, assim como você pode alterar independentemente as propriedades de cada instância de uma classe sem afetar as outras instâncias.

Como as outras respostas que se disse, métodos de instância operar sobre um objeto e tem acesso às suas variáveis de instância, enquanto um método de classe opera em uma classe como um todo e não tem acesso a uma instância específica variáveis do (a menos que você passe a instância como um parâmetro).

Um bom exemplo de um método de classe é um contra-tipo de método, que retorna o número total de instâncias de uma classe.Métodos de classe inicia com um +, enquanto instância iniciam 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

principal.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ê tem um método que você deseja que o usuário seja capaz de chamar, às vezes, é bom fazer com que um método de classe.Por exemplo, se você tem uma classe chamada MathFunctions, você pode fazer isso:

+ (int)square:(int)num{ 
      return num * num;
}

Assim, o usuário teria de chamada:

[MathFunctions square:34];

sem nunca ter que instanciar a classe!

Você também pode usar funções de classe para retornar autoreleased objetos, como um NSArray do

+ (NSArray *)arrayWithObject:(id)object

Que pega um objeto, coloca-lo em um array, e retorna um autoreleased versão da matriz que não tem de ser memória gerenciada, ótimo para temperorary matrizes e o que não.

Espero que agora você entenda quando e/ou por que você deve usar os métodos da 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 está marcado estático. Métodos e propriedades não marcadas estáticas são métodos de instância.

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}

Eu acho que a melhor maneira de entender isso é olhar alloc e init. Foi essa explicação que me permitiu entender as diferenças.

Método da 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 + antes da declaração do 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 exclusiva dessa instância, e não para a classe como um todo. init por exemplo (indicado com um - 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 com 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 receptor da mensagem é uma classe.

[myString initWithFormat:@"Hope this answer helps someone"];

Você está modificando a instância de NSString chamado myString Definindo algumas propriedades nessa instância. Observe como o receptor da mensagem é uma instância (objeto de classe NSString).

A resposta para a sua questão não é específica para objective-c, porém em diferentes linguagens, métodos de Classe podem ser chamados de métodos estáticos.

A diferença entre os métodos de classe e métodos de instância são

Métodos de classe

  • Operam sobre variáveis de Classe (eles não podem acessar variáveis de instância)
  • Não necessitam de um objeto a ser instanciado para ser aplicada
  • Às vezes pode ser um código de cheiro (algumas pessoas que são novas na OOP usar uma muleta para fazer Programação Estruturada em um OO ambiente)

Métodos de instância

  • Operar em instâncias e variáveis de classe as variáveis de
  • Deve ter um instanciated objeto para operar em

Métodos de classe são normalmente utilizados para criar instâncias da classe

Por exemplo, [NSString stringWithFormat:@"SomeParameter"]; retorna um NSString instância com o parâmetro que é enviado para ele.Daí, porque é um método de Classe que retorna um objeto do seu tipo, é também chamado de uma conveniência método.

Então, se eu entendi corretamente.

UMA class O método não precisa que você aloque a instância desse objeto para usá -lo / processá -lo. UMA class O método é independente e pode operar sem qualquer dependência do estado de qualquer objeto dessa classe. UMA class Espera -se que o método aloque a memória para todo o seu próprio trabalho e desalocução 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 O 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 possui um construtor e pode ter um destruidor (que limpa toda a memória alocada).

Na maioria das probabilidades (a menos que você esteja escrevendo uma biblioteca reutilizável, você não deve precisar de um class variável.

Os métodos de instâncias operam em instâncias de classes (ou seja, "objetos"). Os métodos de classe estão associados a classes (a maioria dos idiomas usa a palavra -chave static para esses caras).

Tomemos, por exemplo, um jogo onde muitos carros são gerados..cada um pertence a classe CCar.Quando um carro é instanciado, ele faz uma chamada para

[CCar registerCar:self]

Assim, o CCar classe, pode fazer uma lista de todos os CCar instanciado.Digamos que o usuário termina um nível, e quer remover todos os carros...você pode:1 - passar por uma lista de todos os CCar você criou manualmente, e fazer whicheverCar.remove(); ou 2 - Adicionar um removeAllCars método para CCar, que vai fazer isso para você quando você chamar [CCar removeAllCars].I. e. allCars[n].remove();

Ou, por exemplo, permitem que o usuário especifique um tamanho de fonte padrão para toda a aplicação, que é carregado e guardado na inicialização.Sem o método de classe, você pode fazer algo como

fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();

Com o método de classe, você poderia começar afastado com [FontHandler getDefaultFontSize].

Como é o seu removeVowels função, você verá que linguagens como C#, na verdade, têm ambos com determinados métodos, tais como toLower ou toUpper.

exemplo: myString.removeVowels() e String.removeVowels(myString) (em ObjC que seria [String removeVowels:myString]).

Neste caso a instância provável que chama o método da classe, para que ambos estão disponíveis.i.e.

public function toLower():String{
  return String.toLower();
}

public static function toLower( String inString):String{
 //do stuff to string..
 return newString;
}

basicamente, myString.toLower() chamadas [String toLower:ownValue]

Não há uma resposta definitiva, mas se você sentir vontade de empurrar um método de classe seria melhorar o seu código, dê-lhe um tiro, e ter em mente que um método de classe só irá permitir que você use outros métodos de classe/variáveis.

Métodos de classe

são métodos que são declarados como estáticos. O método pode ser chamado sem criar uma instância da classe. Os métodos de classe só podem operar nos alunos e não nos membros da instância, pois os métodos de classe desconhecem os membros da instância. Os métodos de instância da classe também não podem ser chamados 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 que eles possam ser chamados; portanto, uma instância de uma classe precisa ser criada 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 um instance method respectivamente.

A diferença ficaria clara se chamarmos esses métodos. Aqui os métodos são declarados em MyClass.

instance method requer uma instância da classe:

MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];

Lado de dentro MyClass Outros métodos podem chamar métodos de instância de MyClass usando 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];

MÉTODOS DE CLASSE


Um método de classe, normalmente, cria uma nova instância da classe ou recupera algumas propriedades globais da classe.Métodos de classe não operam em uma instância ou de ter qualquer acesso à variável de instância.


MÉTODOS DE INSTÂNCIA


Um método de instância opera em uma instância específica da classe.Por exemplo, os acessores método que você implementou são todos os métodos de instância.Você usá-los para definir ou obter as variáveis de instância de um objeto particular.


INVOCAR


Para invocar um método de instância, você envia a mensagem para uma instância da classe.

Para chamar um método de classe, você envia a mensagem para a classe diretamente.


Fonte: IOS - objective-C - Métodos de Classe E Métodos de Instância

Os métodos de classe não podem alterar ou saber 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, a mesma idéia se aplica a variáveis.Você vai se deparar com termos como estático, membro de instância, classe e assim por diante, quando se fala sobre variáveis o mesmo que você faria para métodos/funções.

Parece que o termo comum em Obj-C da comunidade é ivar para a variável de instância, mas eu não sou um Obj-C cara, ainda.

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 diferença entre o método da instância e o método de classe após a contagem automática de referência existente no Objective-C.

Por exemplo[NS StringWithformat:..] um método de classe & [[NSString alloc] initwihtformat:..] um método de instância, ambos são os mesmos após o arco

Observação: Isso é apenas em formato de código pseudo

Método da classe

Quase tudo o que precisa fazer é durante 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/plano - - que é único, ou seja, você não tem 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ê chama um método de classe, o ponteiro apontando para isso seria o mesmo.

PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.

Método de instância

Por exemplo, o método de instância acontece durante o tempo de execução, pois é apenas então que você criou uma instância de algo que poderia variar em 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 os mesmos que os métodos de classe.
Se você vem do Swift, os métodos de tipo são os mesmos que os métodos de classe.

Adicionando as respostas acima

Método da classe Trabalhará na aula, usaremos isso para fins gerais, onde +StringWithFormat, tamanho da classe e o mais importante para o init etc.

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

Método de instância Trabalhará em uma instância de uma classe que não está em uma classe como tendo duas pessoas e queremos conhecer o equilíbrio de cada um separadamente aqui, precisamos usar o método da instância. Porque não retornará a resposta geral. por exemplo, como determinar a contagem de nssarray etc.

[johnson getAccountBalance];
[ankit getAccountBalance];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top