Objective-C:何时使用函数vs方法

时间:2013-06-01 03:05:18

标签: objective-c

我已经开始使用Xcode的重构功能(编辑&gt;重构&gt;提取),并注意到Xcode提供了方法功能< /强>

我已阅读hereelsewhere关于两者之间的差异,并了解方法函数不是。所以我不是在寻找定义。

假设不涉及任何参数,何时使用一个而不是另一个?我明白,如果某些事情不是关于这个类,那么它可能是一个函数,但同样,这只是定义。我正在寻找好的用例。

在我个人的情况下,我试图从AppDelegate的applicationDidEnterBackground中重构一些代码。由于它是进入后台处理事件的唯一场所,清理代码的唯一方法是将子程序提取到..井,函数中。但他们会在AppDelegate.m中,所以他们不是方法吗?

嗯..

4 个答案:

答案 0 :(得分:9)

就个人而言,我只在满足以下两个要求时才使用函数:

  1. 我经常在给定的课程或整个项目中使用它,它保证一般化。
  2. 它没有副作用或上下文依赖(没有void *context混乱)。
  3. 在我看来,C风格的功能只应作为最后的手段使用,或者在您真正需要此类应用程序中的功能行为的情况下使用。事件处理既是特定于应用程序的,也是上下文敏感的,所以最好不要单独留下并专注于重构常见模式。

答案 1 :(得分:3)

当你有一个函数时使用函数;-)你知道定义:一个方法有一个隐式参数self并且可以使用它来访问实例变量;函数没有隐式参数 - 必须传递它所需的一切。

如果要重构更大方法的 part ,那么该部分不会访问实例变量,并且您不重构它以便子类可以覆盖它,然后让Xcode为您构建一个函数。完成后,将static添加到该类中,使其成为该类的私有。

在执行此操作时,您没有丢失任何内容,并明确表示该代码是函数 - 它不会改变对象的状态。

选择函数和方法之间当然没有强硬路线,它是模糊边界。例如,如果一段代码只访问一个或两个实例变量但不更新它们,那么您可以选择一个函数 - 再次明确表示对象状态未被修改。但是你不希望在参数中传递大量的实例变量,这很难阅读(而且效率低下)。

使用函数可能很好,而且在Objective-C中这样做肯定也不错。

答案 2 :(得分:2)

类的方法通常需要访问连接到该类的实例变量。 Objective-C中的函数没有连接到类,因此无法访问类的任何非公共成员变量。

考虑类KNode,它包含成员变量_memberVar。

@interface KNode : NSObject {
    int _memberVar;
}

@end

此类的任何方法都可以访问和更改成员变量,但任何旧函数都不能,因为它是私有的。

@implementation KNode

- (void)modify {
    _memberVar = 10;
}

@end

以下功能无效

void modify(KNode * node) {
    _memberVar = 10;
}

答案 3 :(得分:2)

功能的两个小但有意义的优点:

  • 它们可以通过标记static来内部化,或者 __attribute__((visibility("hidden"))),这对框架开发人员很有帮助
  • 可以内联它们。例如,我使用此模式来创建快速延迟队列:

    static inline dispatch_queue_t sharedQueue() { 
        static dispatch_queue_t queue; 
        static dispatch_once_t once; 
        dispatch_once(&once, ^{ 
            queue = dispatch_queue_create("foo", 0); 
        }); 
        return queue;
    }