在 Objective-C 中,当我想调用一个子程序时,我会向一个对象发送一条消息,例如:
[self mySubroutine:myParameter];
有一个(可以忽略不计?)性能损失,所以我可以只使用 C 风格的函数调用:
我的子程序(我的参数);
后者的实现将驻留在类的 @implementation
上下文之外。
这是禁忌吗?常见吗?有这方面的最佳实践吗?
最佳答案
请注意,这些不一定等同。由于 -mySubroutine
是一个实例方法,它可能需要访问一个给定的实例。在那种情况下,您的 mySubroutine()
函数也应该有另一个实例参数。
一般来说,使用一个方法。如果您担心性能,1您始终可以为该方法获取一个 IMP
并将其用作函数而不是标准的 Objective-C 消息分发基础结构。
也就是说,使用函数的一些缺点:
- 它们不能被子类覆盖;
- 没有内省(introspection)(当使用运行时获取 Objective-C 类声明的方法列表时,不枚举函数);
- 它们不能用作已声明属性的访问器/修改器;
- Key-Value Coding 看不到它们;
- 不能直接用于Objective-C消息转发;
- 它们不能直接用于 Cocoa API 需要选择器的各种情况(例如,使用
NSTimer
时)。
使用函数的一些优点:
- 它们不能被子类覆盖(如果你想防止这种情况);
- 没有内省(introspection)(如果你想避免这种情况);
- 它们可以内联;
- 它们可以有文件作用域(
static
),防止来自其他文件的代码访问它们。
1当您确定消息分发基础架构实际上是一个瓶颈时。这确实发生了;例如,一些 Apple 音频示例不使用 Objective-C 进行音频处理。
编辑:根据 OP 的评论,函数的另一个优点是它们不一定与类相关。如果角度正弦的近似值的计算不依赖于 Objective-C 实例,则无需将其作为方法 - 函数更合适。
关于objective-c - 函数调用而不是 self 消息传递——什么时候使用什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6262628/