objective-c - 函数调用而不是 self 消息传递——什么时候使用什么?

标签 objective-c c subroutine

在 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/

相关文章:

ios - 将大数除以 1000 并四舍五入到小数点后一位

c - 如何在以下代码中的每个函数调用中阻止该值变为零?

file - 使用 FileDialog 打开工作簿并对其进行操作

perl - 如何防止子程序在 Perl 中被覆盖?

php - MySQL Query AND IN (select.... - 需要帮助澄清它是一个子例程

iphone - 在iphone中设置Textview的位置

iphone - 使用自定义部分高度时,UITableView 在弹跳后不会返回到正确的位置

ios - `[AVCaptureSession canAddOutput:output]` 间歇性地返回 NO。我能找出原因吗?

共享内存中的c结构

c - pthread_rwlock_rdlock 导致读取器数量变为负数