Qual é a diferença entre um método de classe e um método de instância?
Os métodos de instância são os acessadores (getters e setters), enquanto os métodos de classe são praticamente tudo o resto?
objective-c
oop
methods
class-method
instance-methods
Dedicado
fonte
fonte
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.
fonte
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:main.m:
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:
Então o usuário ligaria para:
sem precisar instanciar a classe!
Você também pode usar funções de classe para retornar objetos liberados automaticamente, como o NSArray
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!
fonte
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.
fonte
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
fonte
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 criadaalloc
.Exemplo
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.Você está modificando a instância de
NSString
chamadamyString
definindo algumas propriedades nessa instância. Observe como o destinatário da mensagem é uma instância (objeto de classeNSString
).fonte
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, usamosalloc
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 umaNSString
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.fonte
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. Umclass
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.fonte
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).fonte
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
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 fazer
whicheverCar.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
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()
eString.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
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.
fonte
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.
fonte
No Objective-C, todos os métodos começam com um caractere "-" ou "+". Exemplo:
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 em
MyClass
.instance method
requer uma instância da classe:Dentro de
MyClass
outros métodos, podemos chamar métodos de instância deMyClass
usoself
:Mas,
class methods
deve ser chamado na própria classe:Ou:
Isso não vai funcionar:
fonte
MÉTODOS DE CLASSE
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.
MÉTODOS DE INSTALAÇÃO
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.
INVOCAR
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
fonte
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.
fonte
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.
fonte
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 ARCfonte
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.
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.
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.
fonte
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
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.
fonte