8

根据在 Objective-C 中为类定义私有方法的最佳方式,我一直在类扩展中声明私有方法。

但是,我刚刚意识到,在 Xcode 4 中,如果我完全省略了私有方法的声明并只实现它,应用程序将编译并运行而不会发出警告或错误。

那么,我是否应该费心在类扩展中声明私有方法?

为什么我们必须声明方法呢?在 Java 中,你不会……在 Ruby 中也不会。

4

3 回答 3

10

仅当调用者在方法之前声明时才需要定义方法定义。为了保持一致性,我建议在扩展中定义您的私有方法。

-(void)somemethod
{
}

-(void)callermethod
{
    //No warning because somemethod was implemented already
    [self somemethod];
}

-(void)callermethod2
{
    //Warning here if somemethod2 is not defined in the header or some extension
    [self somemethod2];
}

-(void)somemethod2
{
}
于 2011-07-20T19:11:43.687 回答
5

在 v4.3 之前,Joe 已经为 Xcode 正确回答了这个答案。但是,在 v4.3 及以上版本中,不仅私有方法不需要声明,而且声明顺序现在无关紧要。有关详细信息,请参阅:

Objective-C 中的私有方法,在 Xcode 4.3 中我不再需要在我的实现文件中声明它们?

于 2012-06-28T00:41:36.753 回答
2

这将在没有声明的情况下编译并运行良好:

- (void)foo {
}

- (void)bar {
    [self foo];
}

但最后我检查了一下,这会发出警告:

- (void)bar {
    [self foo];
}

- (void)foo {
}

换句话说,就像在 C 中一样:如果定义在任何使用之前,则不需要声明。C 需要这样做以避免必须向编译器添加额外的传递(一个来查找函数,然后一个来实际解析它们)。至于是否应该在不需要时声明它们,这实际上取决于您正在使用的代码库的风格。

至于其他不需要声明的语言,有些只需要额外的传递,而另一些则不需要在编译时知道参数的数量和类型或返回类型(它们在运行时查找函数而不是,或者他们没有以强类型变量开头,所以它不“重要”)所以他们可以跳过它。

于 2011-07-20T19:18:59.077 回答