我们可以通过使用sel和imp意味着选择器和实现指针来避免objmsg函数开销。请告诉我们如何避免它?
答案 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重新实现该函数。在几乎所有其他情况下,这都不值得打扰。