关于类别:Objective-C:我应该声明私有方法吗?

Objective-C: Should I declare private methods?

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

但是,我刚刚意识到,在Xcode4中,如果我完全忽略了私有方法的声明并实现了它,那么应用程序编译并运行时不会出现警告或错误。

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

我们为什么还要声明方法呢?在爪哇,你不…红宝石也没有。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(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
{
}


对于v4.3之前的xcode,joe已经正确回答了这个问题。但是,在v4.3及更高版本中,不仅不需要声明私有方法,而且声明顺序现在已经不相关了。有关详细信息,请参见:

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


这将编译并运行良好,无需声明:

1
2
3
4
5
6
- (void)foo {
}

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

但我最后一次检查时,会给出警告:

1
2
3
4
5
6
- (void)bar {
    [self foo];
}

- (void)foo {
}

换言之,它就像在C中一样:如果定义在使用之前,就不需要声明。C需要这样做以避免向编译器添加额外的传递(一个是查找函数,另一个是实际解析函数)。至于是否应该在不必要的时候声明它们,这实际上取决于您所使用的代码库的样式。

对于不需要声明的其他语言,有些语言只需执行额外的过程,而另一些语言则不需要在编译时知道参数的数量和类型或返回类型(它们在运行时查找函数,或者它们没有强类型的变量以开始,因此不"重要"),因此它们可以跳过它。