Objective-C:我应该声明私有方法吗?

时间:2011-07-20 19:05:28

标签: objective-c categories private-methods class-extensions

根据Best way to define private methods for a class in Objective-C,我一直在类扩展中声明私有方法。

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

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

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

3 个答案:

答案 0 :(得分: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
{
}

答案 1 :(得分:5)

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

Private Methods in Objective-C, in Xcode 4.3 I no longer need to declare them in my implementation file ?

答案 2 :(得分:2)

这将编译并运行正常,不需要声明:

- (void)foo {
}

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

但最后我检查过,这会发出警告:

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

- (void)foo {
}

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

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