我可以在Objective-C中内联静态类方法吗?

时间:2011-01-19 21:26:32

标签: objective-c methods inline

您可以将函数声明为如下内联:

#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, ...; {}

如何为非调试编译关闭类的零成本静态方法?

3 个答案:

答案 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)

是!

您可以使用方块来完成

-(void)viewDidLoad {

    void(^inlineFunction)(int) = ^(int argument) {
        NSLog(@"%i", argument);
    };

    inlineFunction(5);//logs '5'

}

Apple甚至对此herearchive)进行了记录,因此它不是许多在线似乎都相信的私有方法。

享受!