这是一个小的优化,可能并不值得花时间去实现,而且我个人从未使用过,但我想了解一下还是很不错的。您可以通过直接使用方法实现来绕过重复的方法分派,而不是一遍又一遍地向同一对象重复发送相同的消息。例如,代替:
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
在方法实现中,第二个参数是选择器 [of typeSEL
] 用于确定方法实现,并变为_cmd
在方法实现中。
如果您不使用正确的“函数定义”(我不记得正确的术语),这种方法很快就会变质。IMP
is a 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
您也许可以将它用于特定类的所有实例,而不仅仅是一个实例,但请小心行事。