在编译期间是否删除了空的Obj-C方法?

时间:2011-08-14 19:49:00

标签: objective-c

我们假设我在课堂上有这样的方法:

- (void)doSomethingOnlyWhenNeeded {
    #ifdef NEEDED

    DO SOMETHING

    #endif
}

如果我定义了NEEDED,一切都OK。但如果没有定义NEEDED,方法是空的,我希望它被删除。是否有任何优化可以删除对这些空方法的调用?如果没有,为什么这可能是一个坏主意?如果是,那么我对此有何控制权?

在哪里可以找到有关此功能的文档?

4 个答案:

答案 0 :(得分:2)

在编译期间不会删除它们,这可以是一种覆盖超类方法的方法,并且无论子类方法的内容如何都会停止调用该方法,这就是我假设该方法持续存在的方式没有内容。

答案 1 :(得分:0)

为什么不在可能调用函数时也使用#ifdef NEEDED

或者,您可以使用块。首先,您可以声明块:

void (^someBlock)(void);

然后根据需要创建

#ifdef NEEDED

someBlock = ^{
  //do something
};

#endif

调用它时,您可以这样做:

if (someBlock)
  someBlock();

如果该块不存在,则不会调用该块。

答案 2 :(得分:0)

不,我不相信那些会被优化掉。现在,这不是一个巨大的问题,除非经常被称为荒谬。如果你处于一个非常紧凑的循环中,那么你应该把条件放在发送消息而不是方法内部。

但基本上,如果你没有注意到你的应用程序运行缓慢并且已经通过Instruments指出了这种方法,那么就做你正在做的事情并转向更重要的编码问题。 :)

答案 3 :(得分:0)

也许我错过了一些东西,但为什么不把方法本身包装在预处理器块中,例如。

#ifdef NEEDED
- (void)doSomethingOnlyWhenNeeded {
    DO SOMETHING
}
#endif

那里,方法现在不再存在了。 : - )