7

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

[self mySubroutine:myParameter];

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

mySubroutine(myParameter);

然后后者的实现将驻留在类的@implementation上下文之外。

这是禁忌吗?这很常见吗?在这方面有最佳实践吗?

4

2 回答 2

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 实例,则无需将其设为方法——函数更适合。

于 2011-06-07T08:56:59.597 回答
2

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

一般来说,如果您需要作用于对象状态的方法,那么 C 方法不会有太大用处,因为您不会隐式访问self,除非您将其作为参数显式传递。

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

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

于 2011-06-07T08:51:54.777 回答