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

我可以在Objective-C中内联静态类方法吗?,objective-c,methods,inline,Objective C,Methods,Inline,可以将函数声明为如下所示的内联线: #ifdef DEBUG void DPrintf(NSString *fmt,...); #else inline void DPrintf(NSString *fmt,...) {} #endif @interface MyClass : NSObject { } + (void)DPrintf:(NSString *)format, ...; // Other methods of this class @end 因此,当您不在调

可以将函数声明为如下所示的内联线:

#ifdef DEBUG
void DPrintf(NSString *fmt,...);
#else
inline void DPrintf(NSString *fmt,...) {}
#endif
@interface MyClass : NSObject {

}

    + (void)DPrintf:(NSString *)format, ...;
    // Other methods of this class
@end
因此,当您不在调试中时,不会对函数产生任何成本,因为它是优化的和内联的。如果你想拥有同样的东西,但是对于一个类方法呢

我的类声明如下:

#ifdef DEBUG
void DPrintf(NSString *fmt,...);
#else
inline void DPrintf(NSString *fmt,...) {}
#endif
@interface MyClass : NSObject {

}

    + (void)DPrintf:(NSString *)format, ...;
    // Other methods of this class
@end
我想将“
DPrintf
”转换成类似于
inline
的东西,这样调用该方法就不会产生任何成本

但我不能这么做:

inline +(void)DPrintf:(NSString *)format, ...; {}

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

请小心。Objective-C方法与C函数不同。编译器将Objective-C方法转换为
objc\u msgSend()
函数调用;您无法控制一个方法是否是内联的,因为这是不相关的。您可以阅读更多有关Objective-C运行时的信息,快速的Google搜索应该会提供更多信息。

Objective-C中没有静态方法。只有类方法,它们与实例方法类似,只是它们属于一个类。这意味着,与实例方法一样,发送给类的消息必须通过消息调度机制来确定要调用的正确方法,这是在运行时完成的。您可以内联调用方法调度机制,但如果没有目前任何Objective-C编译器中都不存在的疯狂优化级别,方法体仍然无法内联

无论如何,这是一个微观优化。如果分析表明这是必要的(几乎永远不会),那么你可以通过体操。否则,请担心应用程序中的实际性能问题。

是! 您可以使用块来完成此操作

-(void)viewDidLoad {

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

}
苹果甚至记录了这个()方法,所以它并不像许多在线用户相信的那样是一个私有方法


享受吧

另外,要注意过早的优化。在打印内容的函数上进行内联标记不太可能节省很多时间,即使该函数被多次调用。内联只在返回非常容易计算的情况下才有意义,因此函数调用开销很大。就调用的指令数量而言,涉及printf的任何变体都不是一件容易的事。此外,今天大多数现代编译器(无论是GCC还是Clang)通常都知道如何识别能够自己内联工作的函数,并将它们自己标记为这样的函数。众所周知,人类不善于估计哪些函数在内联中工作得很好,因此建议您将此问题留给编译器去解决(我听说一些C编译器甚至会忽略您是否将函数标记为内联,所以要小心)来自类方法和静态方法同义的Java背景,请注意,在Objective-C中,类方法是动态解析的——对类对象进行操作,这就是它们不是“静态”的原因。