Método de instancia de llamada del método de clase

Así que necesito llamar a algunos métodos de instancia de los métodos de clase en Objective-C …

Ejemplo:

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

Entonces 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?

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

Las clases son tipos de cosas. Eso es. Simplemente describen lo que hace ese tipo de cosas.

Un ejemplo podría ser que tienes 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” con la que 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.

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 un mensaje. 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.

Entonces, ingenuamente, podrías hacer:

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

Por supuesto, eso perdería la memoria en una aplicación que no es de GC (ya que la instancia no se libera ni se libera automáticamente). En lugar de explicar por qué, le indicaré la documentación de introducción de Objective-C . Es algo impresionante, que abarca tanto Objective-C como patrones generales de progtwigción orientada a objetos.

 + (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];