Qual é a diferença entre “método de class” e “método estático”?

Eu trabalhei com algumas linguagens diferentes, como Java, C # e Objective-C.

Na maioria das linguagens, os methods que não exigem uma instância de um object são chamados de methods estáticos. No entanto, quando se trata de Objective-C, algumas pessoas ficam na defensiva quando você as chama de methods estáticos, e esperam que você as chame de methods de class.

Por que eles são chamados de methods de class em vez de methods estáticos? Qual é a diferença entre um método estático e um método de class?

Então, minha pergunta é por que eles são chamados de methods de class em vez de um método estático? Qual é a diferença entre um método estático e um método de class?

Da Wikipedia: Os methods estáticos não requerem uma instância da class nem podem implicitamente acessar os dados (ou isto, eu, etc.) de tal instância.

Isto descreve exatamente o que os methods de class do Objective-C não são .

Um método de class Objective-C requer muito uma instância que é o alvo da invocação do método. Isto é, requer uma instância da metaclass que descreve o object de class que está sendo chamado.

Ao contrário dos methods estáticos, os methods de class do Objective-C podem ser herdados (o que, em combinação com o self acima mencionado, é exatamente o motivo pelo qual muitas classs podem compartilhar uma implementação única e simples de +alloc no NSObject sem precisar de suas próprias implementações customizadas) e invocando um método de class percorre exatamente o mesmo mecanismo de despacho baseado em objc_msgSend* que qualquer outro site de chamada de método.

Os methods de class do Objective-C podem ser substituídos na hierarquia de classs e podem ser migrados. Nenhum dos quais é suportado em idiomas que normalmente oferecem methods estáticos em vez de methods de class.

A linha inferior é que methods estáticos e methods de class são muito diferentes . Embora essa diferença seja basicamente transparente para fins de codificação do dia a dia, ainda existem situações em que saber como os methods de class funcionam pode economizar uma tonelada de linhas de código desnecessárias.

Por exemplo, você não pode fazer isso com methods estáticos:

 @interface AbstractClass:NSObject + factory; @end @implementation AbstractClass + factory { return [[[self alloc] init] autorelease]; } @end @interface Concrete1:AbstractClass @end @implementation Concrete1 @end @interface Concrete2:AbstractClass @end @implementation Concrete2 @end void foo() { Concrete1 *c = [Concrete1 factory]; Concrete2 *d = [Concrete2 factory]; ... etc ... } 

Embora os methods de class e os methods estáticos sejam, na prática, os mesmos na maior parte do tempo, eles são diferentes. Com methods estáticos, a class está agindo como um qualificador de namespace. Com os methods de class, a própria class é um object e, portanto, os methods de class são para o object de class exatamente a mesma coisa que os methods de instância são para uma instância; Como conseqüência, você pode fazer o seguinte

 @interface TestClass : NSObject + (void)classOrInstanceMethod; - (void)classOrInstanceMethod; @end ... NSArray * arr = [NSArray arrayWithObjects: [[[TestClass alloc] init] autorelease], [TestClass class], nil]; for( id obj in arr ) [obj classOrInstanceMethod]; 

qual versão de classOrInstanceMethod é chamada depende se obj é um object de class ou e instância. Se você estiver familiarizado com o padrão de class de fábrica, esse padrão é parte da linguagem Objective-C.

Porque está dinamicamente ligado, não estático.

Porque é realmente o método de instância de um object de class.

O método da class Objective-C é, na verdade, um método de instância do object de class de um object.

É difícil descrever com texto. Veja boa ilustração aqui.

http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasss.html

Isto é puramente uma diferença histórica, principalmente decorrente do fato de que Objective-C foi desenvolvido contemporaneamente com C ++, e antes que C ++ ou linguagens posteriores como Java e C # tivessem muita influência. Objetivo-C foi essencialmente uma porta do modelo de object Smalltalk para C, portanto, sua syntax e terminologia não necessariamente parecem como “C-like” como o usado pelo C ++. No entanto, Objective-C não estava de forma alguma contrariando uma tendência ao não usar o termo “método estático”, porque essa tendência não estava bem estabelecida em 1983.