5

我一直在查看 Apple 的MVCNetworking 示例项目,其中的部分接口定义让AppDelegate我感到困惑。在 .h 文件中,我们有这个:

@interface AppDelegate : NSObject
{
  ...

但是在 .m 文件中,我们有这个:

@interface AppDelegate () <SetupViewControllerDelegate>
  ...

所以这个类是私下遵守协议的。但是你为什么要这样做而不是在标题中公开声明呢?

4

4 回答 4

5

一般来说,你应该尽可能少地公开曝光。AppDelegate 可以是 SetupViewController 的委托这一事实可能在 AppDelegate 呈现 SetupViewController 时使用。任何其他类都不应该将 AppDelegate 设置为其他一些 SetupViewController 的委托,因此公开宣传该一致性是没有意义的。

于 2011-11-22T20:47:41.523 回答
3

看起来该实现SetupViewController在其“私有”方法之一中使用了内部presentSetupViewControllerAnimated:。由于视图控制器不可公开访问(通过属性或其他方式),因此无需从公共角度声明该类符合协议。换句话说,协议只与类的实现有关,与它提供的公共接口无关。

于 2011-11-22T20:45:20.993 回答
1

有时您想成为另一个对象的委托,但这样做您可能会收到编译器警告,因为您没有明确声明您的类符合协议所需的方法。正如其他人所提到的,面向对象编程的支柱之一是信息隐藏. 在你的头文件中声明一个类实现了一个特定的协议是不可取的,因为你会打破这个原则。它还会使您的课程被滥用或以非预期的方式使用,因为它使其他课程知道该信息。通过在 .m 文件中声明一个私有类别并让编译器知道您实现此协议的意图,您不仅可以摆脱可能出现的警告,而且实际上可以使您的代码自我记录。

于 2011-11-22T21:36:40.710 回答
0

也许是因为你不想让任何人知道你的协议,除了你自己。因此,AppDelegate 外部的任何人都不会将 Appdelegate 的实例作为委托传递给另一个类实例。因此,您将能够在内部将其作为 this 传递。

于 2011-11-22T20:49:19.060 回答