2011-09-02 30 views
25

¿Hay alguna manera de llamar a un método de clase desde otro método dentro de la misma clase?Llamar a un método de clase desde esa clase

Por ejemplo:

+classMethodA{ 
} 

+classMethodB{ 
    //I would like to call classMethodA here 
} 
+0

En primer lugar decimos cómo enviar un mensaje a un método? ¿No cómo llamar a un método? Esta es una forma de decirlo en obj-c. – doNotCheckMyBlog

+0

¿Lo has intentado? ¿Que pasó? –

+0

@Craftero ¿no quieres decir enviar un mensaje a un objeto? Los mensajes no se envían a los métodos. –

Respuesta

8

debe ser tan simple como:

[MyClass classMethodA]; 

Si eso no funciona, asegúrese de que tiene la firma del método definido en la interfaz de la clase. (Generalmente en un archivo .h)

+1

Esa es una forma de hacerlo; sin embargo, eso no respetará la subclasificación. En la mayoría de los casos, probablemente sea más prudente usar [self classMethodA]. Como entiendo en un método de clase "self" sería el objeto de clase (porque los métodos de clase son métodos de instancia de una clase). Entonces se llamaría el método de MyClass pero no el classMethodA de MyClassSubclass – csga5000

+0

También tenga en cuenta que dijo en la pregunta "dentro de la misma clase" – csga5000

3

Sure.

Digamos que tiene estos métodos definidos:

@interface MDPerson : NSObject { 
    NSString *firstName; 
    NSString *lastName; 

} 

+ (id)person; 
+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 
- (id)initWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 


@property (copy) NSString *firstName; 
@property (copy) NSString *lastName; 

@end 

Los primeros métodos de la clase 2 se podrían implementar como sigue:

+ (id)person { 
    return [[self class] personWithFirstName:@"John" lastName:@"Doe"]; 
} 

+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast { 
    return [[[[self class] alloc] initWithFirstName:aFirst lastName:aLast] 
                 autorelease]; 
} 
59

En un método de clase, self refiere a la clase que se envió un mensaje. Así que desde el interior de otro método de clase (digamos classMethodB), utilice:

+ (void)classMethodB 
{ 
    // ... 
    [self classMethodA]; 
    // ... 
} 

Desde el interior de un método de instancia (por ejemplo instanceMethodB), utilice:

- (void)instanceMethodB 
{ 
    // ... 
    [[self class] classMethodA]; 
    // ... 
} 

Nota presume que ni la clase que son los mensajes. La clase real puede ser una subclase.

+1

Cambió su terminología. '[self foo]' por ejemplo, métodos, '[MyClass bar]' para métodos de clase. –

+8

No. El significado de "self" depende de lo que estás enviando. Si envía un mensaje a una clase, 'self' es la clase. Si envía un mensaje a una instancia, 'self' es la instancia. Explico la importancia de la mensajería para los métodos de clase en http://qualitycoding.org/factory-method/ –

+0

De acuerdo, lo que dices en tu comentario es cierto, pero la terminología en tu respuesta es literalmente al revés. Usar '[self class]' en un método de instancia no tiene mucho sentido, pero tiene mucho sentido en un método de clase. Recuerde que los métodos de instancia comienzan con '-', los métodos de clase comienzan con' + ', y usar' self' para referirse a una instancia de un objeto tiene significado sintáctico pero usando '[self class]' para referirse a una instancia de un objeto no tiene sentido sintácticamente. '[self class]' implica referencia a un objeto que describe la clase, y no a una instancia de la clase. –

4

En el objetivo C 'self' se usa para llamar a otros métodos dentro de la misma clase.

lo que sólo necesita escribir

+classMethodB{ 
    [self classMethodA]; 
} 
+1

'self' solo es apropiado por ejemplo, pero la pregunta sugiere que está hablando acerca de los métodos de clase (con el signo '+' antes del nombre del método) –

Cuestiones relacionadas