2010-01-23 18 views
17

así que tengo que llamar a algunos de los métodos de instancia métodos de la clase en objecitve-c ...método de instancia de llamada de método de clase

Ejemplo:

+(id)barWithFoo:(NSFoo *) { 
[self foo]; //Raises compiler warning. 
} 

-(void)foo { 
//cool stuff 
} 

Así que mi pregunta; StackOverFlow es ¿cómo haces esas cosas en Objective-C, soy nuevo en OOP, entonces estoy loco, o hay una manera de hacer esto?

+0

Este hilo respondió por mí: http://stackoverflow.com/questions/1053592/objective-c-class-vs-instance-methods – jsherk

+1

No, no responde a la pregunta de discutible. Moot quiere saber si es posible llamar a un método de instancia desde dentro de un método de clase. No, no podemos !! Pero podría usar 'NSNotificationCenter', agregar un observador con un selector en su método de instancia, y' postNotification' desde su método de clase –

Respuesta

14

Si desea llamar a un método de instancia, necesita una instancia para llamar al método.

self es una referencia a la instancia que se está enviando. Por lo tanto, self en un método de clase es la clase y self en un método de instancia es una instancia de la clase.

Así que, ingenuamente, que podría hacer:

+(id)barWithFoo:(NSFoo *) { 
    [[[self alloc] init] foo]; //Raises compiler warning. 
} 

-(void)foo { 
//cool stuff 
} 

Por supuesto, eso sería pérdida de memoria en una aplicación no-GC (ya que la instancia no está siendo puesto en libertad o autoreleased). En lugar de explicar por qué, le indicaré el Objective-C intro documentation. Es algo impresionante, que abarca tanto Objective-C como patrones generales de programación orientada a objetos.

+0

Esta es una buena solución ¡Gracias !, aunque debo admitir que esto va contra el objeto - orientación. – Moot

+3

No, no es así. Un patrón común es crear una instancia de algún objeto y luego decirle '-startSinghingUsefulAutomatically'. Una vez iniciado, el objeto puede dejarse en sus propios dispositivos durante el resto de la sesión de la aplicación. – bbum

+2

Tampoco es una solución.Preguntaste cómo llamar a un método de instancia desde un método de clase. Para hacerlo, se requiere una instancia. Fin de la historia. – bbum

25

No hay una manera de hacer esto. Simplemente no funciona con orientación a objetos.

Las clases son clases de cosas. Eso es. Simplemente describen qué hace ese tipo de cosas.

Un ejemplo podría ser que tiene una clase 'Perro'. Tendría métodos de instancia que definirían cómo un perro mueve la cola o cómo se come. Es posible que tenga un método de clase para comprar un perro.

Mi perro mascota Fido es una instancia de perro de clase. Puedo enviarle mensajes de Fido, diciéndole que mueva la cola y coma su comida. No puedo, sin embargo, pedirle a la clase 'Perro' que mueva la cola; ¿A quién le seguiría la cola? ¿Sería Fido's, o sería el perro de mi vecino?

Cuando envía un mensaje a la clase, no tiene una variable "propia" para trabajar. No hay nada que pueda decirse que mueve su propia cola. Los mensajes de clase se usan principalmente para crear instancias de la clase u obtener otra información general.

Editar: Para aclarar, ese último párrafo es una simplificación excesiva. Hay una 'auto' variable en los métodos de clase como describe bbum, es la referencia de la computadora a la descripción de la clase. Dicho esto, no creo que alguna vez haya tenido la oportunidad de usar 'yo' en un método de clase.

+0

¡Esto es bastante revelador! ¡Muchas gracias! – Moot

0
+ (MyClass *)getInstance 
{ 
    static MyClass *classInstance; 

    @synchronized(self) 
    { 
     if (!classInstance) 
     { 
      // This is never freed. Is a singleton a leak? 
      classInstance = [[[MyClass alloc] init] retain]; 
     } 
    } 

    return classInstance; 
} 

[[MyClass getInstance] instanceMethod]; 
Cuestiones relacionadas