在 Objective-C 中,当我想调用一个子程序时,我会向一个对象发送一条消息,例如:
[self mySubroutine:myParameter];
有一个(可以忽略不计?)性能损失,所以我可以只使用 C 风格的函数调用:
mySubroutine(myParameter);
然后后者的实现将驻留在类的@implementation
上下文之外。
这是禁忌吗?这很常见吗?在这方面有最佳实践吗?
在 Objective-C 中,当我想调用一个子程序时,我会向一个对象发送一条消息,例如:
[self mySubroutine:myParameter];
有一个(可以忽略不计?)性能损失,所以我可以只使用 C 风格的函数调用:
mySubroutine(myParameter);
然后后者的实现将驻留在类的@implementation
上下文之外。
这是禁忌吗?这很常见吗?在这方面有最佳实践吗?
请注意,这些不一定是等效的。由于-mySubroutine
是一个实例方法,它可能需要访问给定的实例。在这种情况下,您的mySubroutine()
函数也应该有另一个实例参数。
一般来说,使用一种方法。如果您担心性能,1您总是可以使用IMP
该方法并将其用作函数,而不是标准的 Objective-C 消息调度基础设施。
也就是说,使用函数的一些缺点:
NSTimer
)。使用函数的一些优点:
static
),以防止其他文件中的代码访问它们。1当您确定消息分发基础设施实际上是一个瓶颈时。这确实发生了;例如,一些 Apple 音频示例不使用 Objective-C 进行音频处理。
编辑:根据 OP 的评论,函数的另一个优点是它们不一定与一个类相关。如果角度正弦的近似值的计算不依赖于 Objective-C 实例,则无需将其设为方法——函数更适合。
在具有静态实用程序功能的地方(例如数学库)可能值得使用。
一般来说,如果您需要作用于对象状态的方法,那么 C 方法不会有太大用处,因为您不会隐式访问self
,除非您将其作为参数显式传递。
您还可能遇到命名空间问题。使用 Objective-C 不同的类可以共享方法名称,使用 c 方法,您的所有函数都需要不同的签名。
我个人会一直使用objective-c方法,性能差异可以忽略不计。