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