【问题标题】:Objective-C: Should I declare private methods?Objective-C:我应该声明私有方法吗?
【发布时间】:2011-10-09 16:12:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • 好吧,除非你声明它们,否则你不能让 xcode 自动完成方法。

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


【解决方案1】:

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

-(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
{
}

【讨论】:

  • 不完全是一个类别和扩展名略有不同。在扩展中,你可以添加 ivars,如果你没有实现你在扩展中声明的方法,编译器会抱怨。我确信它们还有其他差异,但这些是我利用的。
  • 类扩展不允许您添加 iVar,但两者之间的区别是扩展方法需要在主@implementation 中实现,而它不是一个类别。
  • 不,你可以在我一直使用的扩展中添加 ivars。像@interface UIViewController () 这样的括号之间没有任何东西声明了一个扩展,而像@interface UIViewController (myCategory) 这样的括号之间确实有一个类别。 iOS 食谱一书中提到了这种技术 - 我无法在苹果文档中找到它
  • 我刚刚再次测试了我自己的理智,不,它在扩展中不起作用!但这是使用 LLVM GCC 4.2 编译器,较新的 LLVM 2.0 确实支持这一点。我所有现有的项目都使用了 GCC 编译器 :)
【解决方案2】:

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

- (void)foo {
}

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

但上次我检查过,这会给出警告:

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

- (void)foo {
}

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 2010-10-13
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多