您可以将函数声明为如下内联:
#ifdef DEBUG
void DPrintf(NSString *fmt,...);
#else
inline void DPrintf(NSString *fmt,...) {}
#endif
因此,当您不在DEBUG中时,该功能不会产生任何成本,因为它已经过优化和内联。如果你想拥有相同的东西,但是对于一个类方法怎么办?
我的课程声明如下:
@interface MyClass : NSObject {
}
+ (void)DPrintf:(NSString *)format, ...;
// Other methods of this class
@end
我想将“DPrintf
”转换为与inline
类似的内容,以便调用该方法无需任何费用。
但我不能这样做:
inline +(void)DPrintf:(NSString *)format, ...; {}
如何为非调试编译关闭类的零成本静态方法?
答案 0 :(得分:9)
小心点。 Objective-C方法与C函数不同。 Objective-C方法由编译器转换为objc_msgSend()
函数调用;您无法控制方法是否内联,因为这是无关紧要的。您可以阅读有关Objective-C运行时here (Objective-C Runtime Programming Guide),here (Objective-C Runtime Reference)和here (CocoaSamurai post)的更多信息,快速Google搜索应该会显示更多信息。
答案 1 :(得分:7)
Objective-C中没有静态方法。只有类方法,它们就像实例方法一样,除了它们属于一个类。这意味着,就像实例方法一样,发送给类的消息必须通过消息调度机制来确定要调用的正确方法,并且这是在运行时完成的。您可以内联对方法调度机制的调用,但是如果没有目前任何Objective-C编译器中不存在的疯狂级别的优化,方法体仍然无法内联。
无论如何,这是微观优化。如果剖析显示它是必要的(它几乎不会),那么你可以通过体操。否则,请担心应用程序中的实际性能问题。
答案 2 :(得分:0)