在实现文件中使用私有方法的类别?

时间:2011-07-11 11:15:37

标签: iphone objective-c ios categories

我真的不明白在appDelegate中写一个“类别”的意思,例如,只是为了添加一个似乎是“私有”的方法。我们为什么要这样做?我真的不明白为什么在实现文件中“隐藏”或“存储”这个私有方法很重要,如下例所示:

#import "LetsMakeAThreadAppDelegate.h"

@interface  LetsMakeAThreadAppDelegate (Static)
    - (void)backgroundThinking;
@end

@implementation LetsMakeAThreadAppDelegate
...

你有什么建议吗? 由于
保罗

2 个答案:

答案 0 :(得分:3)

类别(在私有方法的上下文中):

Objective C没有提供任何预定义方式来声明私有方法。所以类别用于声明它们。

如果在类的实现( .m )文件中添加类别(不一定是同一个类),那么您在category不会对其他类可见,因为它们是在实现文件中声明的,而不是标题(.h)文件。因此,这些方法将成为声明它们的类的私有。

但是,如果在 .h 文件中添加了类别,则只需导入标题 .h 文件,其他类就可以访问该类别中声明的方法。无论如何导入文件在这种情况下没有任何魔力。我只是禁止“可能不响应选择器”警告。

答案 1 :(得分:3)

为什么要隐藏方法有很多原因,但所有这些(imho)归结为两个词:“编程风格”。

  • 虽然您仍然可以向对象发送一条调用隐藏方法的消息,但您会收到一条警告,指出该对象可能无法理解它。这可以用作提醒您正在调用一个从未打算从另一个对象调用的方法。

  • 隐藏“主力”方法还增加了代码完成建议列表的整洁性,使得更快地找到正确的方法。

  • 如果您正在组建团队或打算分享您正在撰写的代码,那么隐藏所有方法,但与您的课程接口所需的方法可能会显着改善工作条件。虽然您可能不想隐藏实际代码,但它有助于防止队友使用方法,如果在上下文之外使用,则结果是未定义的。这样,队友只需要了解你班级的界面,而不是内部人员才能使用它。

  • 最后但并非最不重要的是,我发现在适当时花时间隐藏方法也有助于(我)减少我写的意大利面条代码的数量,因为它迫使我重新考虑 - 这种方法实际上做了什么?相同的功能在其他地方是否有用,我应该将其部分代码包装到一个单独的实用程序类中,以便更容易重用它吗?

当然,如果你没有严格的规划阶段,并且没有倾向于进行实验/编码,那么这些都可能与你无关。