method example objective-c terminology static-methods class-method

objective-c - example - static method php



¿Cuál es la diferencia entre "método de clase" y "método estático"? (4)

Entonces mi pregunta es ¿por qué se llaman métodos de clase en lugar de un método estático? ¿Cuál es la diferencia entre un método estático y un método de clase?

Desde Wikipedia: los métodos estáticos no requieren una instancia de la clase ni pueden acceder implícitamente a los datos (o esto, a uno mismo, a mí, etc.) de dicha instancia.

Esto describe exactamente lo que no son los métodos de clase de Objective-C.

Un método de clase Objective-C requiere mucho una instancia que sea el objetivo de la invocación del método. Es decir, requiere una instancia de la metaclase que describa el objeto de clase que se invoca.

A diferencia de los métodos estáticos, los métodos de clase de Objective-C pueden heredarse (lo que, en combinación con tener el self mencionado anteriormente, es exactamente la razón por la cual muchas clases pueden compartir una implementación simple y simple de +alloc en NSObject sin necesitar sus propias implementaciones personalizadas) e invocar un método de clase pasa exactamente por el mismo mecanismo de envío objc_msgSend* que cualquier otro sitio de llamada a método.

Los métodos de clase de Objective-C pueden anularse en toda la jerarquía de clases y se pueden eliminar. Ninguno de los cuales es compatible con idiomas que generalmente ofrecen métodos estáticos en lugar de métodos de clase.

La conclusión es que los métodos estáticos y los métodos de clase son muy diferentes . Si bien esa diferencia es principalmente transparente para los fines de la codificación diaria, todavía hay situaciones en las que saber cómo funcionan los métodos de clase puede ahorrarle una tonelada de líneas innecesarias de código.

Por ejemplo, no puedes hacer esto con métodos 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 ... }

He trabajado con algunos idiomas diferentes, como Java, C # y Objective-C.

En la mayoría de los lenguajes, los métodos que no requieren una instancia de un objeto se llaman métodos estáticos. Sin embargo, cuando se trata de Objective-C, algunas personas se ponen a la defensiva cuando los llama métodos estáticos y esperan que los llames métodos de clase.

¿Por qué se les llama métodos de clase en lugar de métodos estáticos? ¿Cuál es la diferencia entre un método estático y un método de clase?


Aunque los métodos de clase y los métodos estáticos son en la práctica la misma la mayor parte del tiempo, son diferentes. Con los métodos estáticos, la clase actúa como un calificador de espacio de nombres. Con los métodos de clase, la clase en sí es un objeto, por lo que los métodos de clase son para el objeto de clase exactamente lo mismo que los métodos de instancia para una instancia; como consecuencia, puedes hacer lo siguiente

@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];

a qué versión de classOrInstanceMethod se llama depende de si obj es un objeto de clase o una instancia. Si está familiarizado con el patrón de clase de fábrica, este patrón es parte del lenguaje Objective-C.


Esta es una diferencia puramente histórica, en gran parte derivada del hecho de que Objective-C se desarrolló contemporáneamente con C ++, y antes de C ++ o lenguajes posteriores como Java y C # tuvieron mucha influencia. Objective-C era esencialmente un puerto del modelo de objetos de Smalltalk para C, por lo que su sintaxis y terminología no necesariamente parecen tan "parecidas a C" como las utilizadas por C ++. Sin embargo, Objective-C de ninguna manera se oponía a una tendencia al no usar el término "método estático", porque esa tendencia no estaba bien establecida en 1983.