Вот небольшая оптимизация, которая может не стоить потраченного времени на реализацию, и которую я никогда не использую лично, но, думаю, все же полезно знать о ней. Вместо того, чтобы многократно отправлять одно и то же сообщение одному и тому же объекту снова и снова, вы можете обойти повторную отправку метода, напрямую используя реализацию метода. Например, вместо:
for (int i = 0; i < 100000000; i++)
[someObject messageWithInt:i];
Вы можете попробовать:
SEL theSelector = @selector(messageWithInt:);
IMP theMethod = [someObject methodForSelector:theSelector];
for (int i = 0; i < 100000000; i++)
theMethod (someObject, theSelector, i);
Это означает, что поиск метода выполняется только один раз, и вы можете вызвать метод напрямую через возвращенное значение IMP
. Все реализации метода Objective C принимают как минимум два аргумента, первый аргумент - это принимающий объект типа id
, который становится self
в реализации метода, а второй аргумент - селектор [типа SEL
], который был использован для определения реализации метода и становится _cmd
в реализации метода.
Этот подход может быстро сгореть, если вы не используете правильное & ldquo; определение функции & rdquo; (Я не могу вспомнить правильный термин). IMP
- это typedef
для функции, которая возвращает void*
и принимает (id,SEL,...)
в качестве аргументов. Это может затруднить использование, если метод на самом деле возвращает что-то еще, например float
. Чтобы помочь в этом, вы можете привести возвращаемое значение -methodForSelector:
, например:
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);
С некоторой осторожностью вы можете сохранить theMethod
и, возможно, сможете использовать его для всех экземпляров определенного класса, а не только для одного экземпляра, но осторожно действуйте.