2011-01-19 10 views
5

Se puede declarar como funciones inline como este:¿Puedo aplicar métodos de clase estática en línea en Objective-C?

#ifdef DEBUG 
void DPrintf(NSString *fmt,...); 
#else 
inline void DPrintf(NSString *fmt,...) {} 
#endif 

de modo que cuando no estás en DEBUG, no hay ningún costo para la función porque está optimizado y en línea. ¿Qué pasa si quieres tener lo mismo pero para un método de clase?

Mi clase se declara así:

@interface MyClass : NSObject { 

} 

    + (void)DPrintf:(NSString *)format, ...; 
    // Other methods of this class 
@end 

Quiero cambiar 'DPrintf' en algo similar a la inline de manera que no hay ningún costo para invocar el método.

Pero no puedo hacer esto:

inline +(void)DPrintf:(NSString *)format, ...; {} 

¿Cómo puedo tener un método estático de costo cero de una clase apagado para las compilaciones de no depuración?

Respuesta

8

Ten cuidado. Los métodos de Objective-C no son lo mismo que las funciones de C. El compilador traduce un método Objective-C en la llamada a la función objc_msgSend(); no tiene control sobre si un método está en línea o no, porque eso es irrelevante. Puede leer más sobre el tiempo de ejecución de Objective-C here (Objective-C Runtime Programming Guide), here (Objective-C Runtime Reference) y here (CocoaSamurai post), y una búsqueda rápida en Google debería mostrar más información.

+4

Además, tenga cuidado con la optimización prematura. No es probable que una marca en línea de una función que está imprimiendo cosas ahorre mucho tiempo, incluso si la función se llama mucho. La mayoría de las veces solo tiene sentido cuando el retorno es muy fácil de calcular, por lo que la sobrecarga de llamada a la función es significativa. Nada que implique una variación de printf es fácil en términos de número de instrucciones llamadas. –

+4

Además del hecho de que hoy en día, la mayoría de los compiladores modernos (ya sean GCC o Clang) generalmente saben cómo reconocer funciones que funcionan bien en línea por sí mismas, y los marcarán ellos mismos como tales. Los humanos son notoriamente malos a la hora de estimar qué funciones funcionan bien en línea, por lo que se recomienda dejarlo solo para que el compilador lo descubra (he oído hablar de algunos compiladores C que incluso ignorarán si marca funciones como en línea o no, así que sea cauteloso). –

6

No existe un método estático en Objective-C. Solo hay métodos de clase, que son como métodos de instancia, excepto que pertenecen a una clase. Esto significa que, al igual que los métodos de instancia, un mensaje enviado a una clase debe ir a través de la maquinaria de envío de mensajes para determinar el método correcto para llamar, y eso se hace en tiempo de ejecución. Puede alinear la llamada al mecanismo de envío de métodos, pero el cuerpo del método aún no puede incluirse sin un nivel loco de optimización que no existe en ningún compilador de Objective-C en este momento.

En cualquier caso, se trata de una micro-optimización. Si el perfil muestra que es necesario (que casi nunca lo hará), entonces puede pasar por la gimnasia. De lo contrario, preocúpese por las preocupaciones reales de rendimiento en su aplicación.

+3

Para aquellos (como yo) provenientes de un fondo Java donde los métodos de clase y los métodos estáticos son sinónimos, tenga en cuenta que en Objective-C los métodos de clase se resuelven dinámicamente, operando en objetos de clase, por lo que no son "estáticos". http://en.wikipedia.org/wiki/Method_(computer_programming) –

Cuestiones relacionadas