He aquí una pequeña optimización que en realidad no puede valer la pena el tiempo para poner en práctica, y uno que nunca uso personal, pero todavía adivinar bueno conocer. En lugar de enviar repetidamente el mismo mensaje al mismo objeto una y otra vez, puede omitir el envío repetido de métodos mediante el uso directo de la implementación del método. Por ejemplo, en lugar de:
for (int i = 0; i < 100000000; i++)
[someObject messageWithInt:i];
Usted podría intentar:
SEL theSelector = @selector(messageWithInt:);
IMP theMethod = [someObject methodForSelector:theSelector];
for (int i = 0; i < 100000000; i++)
theMethod (someObject, theSelector, i);
Esto significa que las operaciones de búsqueda método sólo se realiza una vez y se puede invocar el método directamente a través del IMP
valor devuelto. Todas las implementaciones método objetivo-C toman al menos dos argumentos, el primer argumento es el objeto receptor de tipo id
, que se convierte self
dentro de la implementación del método, y el segundo argumento es el selector [de tipo SEL
] que se utilizó para determinar el método implementación, y se convierte en _cmd
en la implementación del método.
Este enfoque puede agriarse rápidamente si no utiliza la definición de función “ correcta ” (no recuerdo el término adecuado). IMP
es una typedef
para una función que devuelve void*
y toma como argumentos (id,SEL,...)
. Esto puede dificultar el uso si el método realmente devuelve algo más como float
. Para ayudar en esta materia, se puede convertir el valor devuelto de -methodForSelector:
, así:
typedef float (*MyMethodIMP)(id,SEL,int);
SEL theSel = @selector(messageWithInt:);
MyMethodIMP theMethod = (MyMethodIMP)[someObject methodForSelector:theSel];
float result = 0.0;
for (int i = 0; i < 100000000; i++)
result += theMethod (someObject, theSel, i);
Con un poco de cuidado, puede guardar el theMethod
y usted puede ser capaz de utilizarlo para todas las instancias de una clase en particular, no solo una instancia, sino que pise con cuidado.
Este tema se discute en gran detalle aquí: http://www.mulle-kybernetik.com/artikel/Optimization/ – codewarrior
En un marco de alto nivel como el cacao, la mayoría pequeñas optimizaciones como este son una pérdida de tiempo (además de cambiar la configuración del compilador), ya que muchas clases fundamentales ya están muy optimizadas. Solo debe optimizar si los perfiles muestran que algo está tomando mucho tiempo extra. – shosti