函数调用而不是自我消息 - 何时使用什么?

时间:2011-06-07 08:37:03

标签: objective-c c subroutine

在Objective-C中,当我想调用子例程时,我向对象发送消息,如:

[self mySubroutine:myParameter];

有一个(可忽略的?)性能损失,所以我可以使用C风格的函数调用:

mySubroutine(myParameter);

后者的实现将位于类的@implementation上下文之外。

这是不是吗?这很常见吗?对此有最好的做法吗?

2 个答案:

答案 0 :(得分:7)

请注意,这些不一定相同。由于-mySubroutine是一个实例方法,因此可能需要访问给定的实例。在这种情况下,您的mySubroutine()函数也应该具有该实例的另一个参数。

通常,使用方法。如果您担心性能, 1 ,您始终可以获得该方法的IMP并将其用作函数,而不是标准的Objective-C消息调度基础结构。

那说,使用函数的一些缺点:

  • 它们不能被子类覆盖;
  • 没有内省(当使用运行时获取Objective-C类声明的方法列表时,不枚举函数);
  • 它们不能用作声明属性的访问器/变更器;
  • Key-Value Coding;
  • 无法看到它们
  • 它们不能直接用于Objective-C消息转发;
  • 它们不能直接用于Cocoa API需要选择器的各种情况(例如,当使用NSTimer时)。

使用功能的一些优点:

  • 它们不能被子类覆盖(如果你想阻止它);
  • 没有内省(如果你想阻止这种情况);
  • 他们可以内联;
  • 他们可以拥有文件范围(static),防止来自其他文件的代码访问它们。

1 当您确定消息调度基础架构确实是一个瓶颈时。这确实发生了;例如,某些Apple音频示例不使用Objective-C进行音频处理。

编辑:根据OP的评论,功能的另一个优点是它们不一定与某个类相关。如果角度正弦的近似值的计算不依赖于Objective-C实例,则不需要将其作为方法 - 函数更适合。

答案 1 :(得分:2)

在具有静态实用程序功能的地方使用它可能是值得的,例如在数学库中。

一般情况下,如果您需要对对象状态起作用的方法,那么C方法将没有多大用处,因为您不会隐式访问self,除非您明确地传递它作为参数。

您可能还会遇到名称空间问题。使用Objective-C,不同的类可以共享方法名称,使用c方法,所有函数都需要不同的签名。

我个人总是使用objective-c方法,性能差异可以忽略不计。