避免objmsg函数开销?

时间:2011-03-17 07:46:47

标签: objective-c

我们可以通过使用sel和imp意味着选择器和实现指针来避免objmsg函数开销。请告诉我们如何避免它?

3 个答案:

答案 0 :(得分:5)

// first, access the SELector you're interested in (example)
SEL sel = @selector(<#SOMETHING#>);

// this is the definition of IMP
id (*IMP)(id, SEL, ...);

使用以下方法访问IMP以获取特定类的实例:  + (IMP)instanceMethodForSelector:(SEL)aSelector;

理想情况下,您将将instanceMethodForSelector:的结果转换为您调用的函数的精确 typedef,以便编译器可以正确获取sig。

一旦你有了SEL和IMP对象,那么就把IMP用作普通的C函数指针。

返回IMP函数的第一条消息是对象(= self),第二条参数是选择器(= _cmd)。这些是2个隐藏的objc参数。

答案 1 :(得分:1)

我认为您的要求是分析的结果,而不是过早优化的情况。

1)您可以获取方法的实现(请参阅Justin的回答)。详细说明 - objc_msgSend中没有太多开销。大多数情况下,它会检查nil的{​​{1}}值,在缓存中搜索IMP并对IMP执行尾调用(http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/)。如果您想保存这几条说明,那么......

2)...从头开始在C中编写你的功能。它是更具可读性和可靠性的解决方案。

答案 2 :(得分:1)

这个问题的唯一严肃答案是

  

使用Objective-C以外的东西

老实说,任何避免obj_msg_send()的方法都保证是脆弱的,每次通话可能会节省你的纳秒。如果你确实有一个非常短的函数,那么你应该只使用C重新实现该函数。在几乎所有其他情况下,这都不值得打扰。