2010-04-22 18 views
31

En Java, que puede tener una clase, por ejemplo, Utility y tengo un método estático llamado changeToCapitalLetter, por lo que se puede hacer algo como esto:¿Cómo puedo hacer un método estático en Objective-C?

Utility.changeToCapitalLetter(myString); 

¿Cómo puedo hacer la cosa similar en Objective C?

Muchas gracias

Respuesta

89

en Objective-C, se llama a este "métodos de clase", ver here:

@interface MyClass : NSObject 

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

@end 

El + es lo importante; se llama al método como este: [MyClass aClassMethod];

+2

derecho, pero recuerde que puede declarar siempre funciones de C globales normales también. –

15

De Wikipedia: Los métodos estáticos no requiere una instancia de la clase ni pueden acceder de manera implícita los datos (o este, sí, Me, etc.) de tal una instancia.

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

Un método de clase Objective-C requiere una instancia que es 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 (que, en combinación con tener el self mencionado, es exactamente la razón por la que muchas clases pueden compartir una única implementación de + alloc en NSObject sin necesidad de personalizar implementaciones) 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 se pueden anular en la jerarquía de clases y se pueden dividir. Ninguno de los cuales es compatible con idiomas que generalmente ofrecen métodos estáticos en lugar de métodos de clase.

Aunque los métodos de clase y el método estático son en la práctica la misma la mayor parte del tiempo, son diferentes. Con los métodos estáticos, la clase está actuando como un calificador de espacio de nombres. Con los métodos de clase de la clase en sí es un objeto y por lo tanto los métodos de clase son de la clase de objeto exactamente los mismos métodos de instancia que están a una instancia, como consecuencia, puede hacer lo siguiente

@interface TestClass : NSObject 

    +(void)classOrInstanceMethod; 
    -(void)classOrInstanceMethod; 

    @end 

    @implementation TestClass 

    +(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    -(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    @end 

    int main(int argc, const char* argv[]) 
    { 
     @autoreleasepool{ 
      NSLog(@"Static method in ObjectiveC"); 
     } 

     NSArray* arr = [NSArray arrayWithObjects:[[TestClass alloc]init], 
              [TestClass class], nil]; 
     for(id obj in arr) 
      [obj classOrInstanceMethod]; 
    } 

la 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.

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.

de Orignal Enlaces here y here

+1

Es justo notar que esta no es una respuesta original; [fue escrito aquí.] (https://stackoverflow.com/a/8089623/6645482) –

Cuestiones relacionadas