8

我在使用 iOS6 beta 3 时注意到了这一点

当我创建 UIViewContoller 的新子类时(没有其他父类生成我注意到的这种行为),.m 文件现在在文件顶部有一个空类别。过去在学习类别时,我注意到有些人会使用相同的技术来表示私有方法(尽管不是真正的私有方法)。

这就是这里的意图吗?现在将事情真正私有化有什么变化吗?我也注意到了@private 指令。

关于私有变量和方法,您的个人编码风格是什么?

更新:由于 XCode 推动我们使用类扩展,我继续将它们用于该项目的私有方法/ivar。不过我发现了一个缺点。我看到我可以重用我的一个子类 UIViewController 以及它的所有 UIButton、UILabels 等......我有这个继承:UIViewController <- FirstViewController <- SecondViewController。

好吧,当我在 SecondViewController 中编码时,我放在 FirstViewController 的类扩展中的所有私有方法都不会在自动完成中弹出。轻微的烦恼......

4

1 回答 1

20

你指的是这个接口定义:

@interface MYViewController ()
@end

这在技术上是一个类扩展而不是一个类别。类别在括号内有一个字符串。类扩展在编译时添加到类中,因此可以添加 ivars(通常以属性的形式)。类别是在运行时添加的,不能添加 ivars。

说了这么多,你的观点是正确的。这用于定义私有方法和属性。

在 ObjC 的世界里,“私人”是一个“禁止侵入”的标志,而不是铁丝网。虽然有一个@private关键字(增加了编译器强制执行),但它仅适用于 ivars,通常不是必需的。这种基于警告的隐私在 ObjC 中运行得非常好,并且已经足够了。

将您的私有属性放在此类扩展中,如果外部调用者尝试访问它们,他们将收到“可能无法响应选择器”警告(就像调用任何未定义的方法一样)。您不应该允许警告存在于 ObjC 项目中,因此这会强制执行数据封装。


编辑

如果它们是私有的,那么它们不应该出现在您的子类中。你想要的东西是受保护的。ObjC 中的受保护方法没有很好的方案,但一种常见的技术是将它们放入 .h 文件中的一个类别中,例如 MYViewController+Protected.h。我发现这在实践中很少出现,因为很多好的 ObjC 设计都没有子类化。它改为使用组合和委托。

关于“为什么只查看控制器”。首先,它不仅仅是视图控制器。它只是 iOS 上的视图控制器(嗯,VC、TableViewController 和 GLKViewController)。在 Mac 上,它也是窗口控制器和聚光灯导入器。在看:

.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
.../Library/Xcode/Templates

但为什么是那些?好吧,这些都是控制器,控制器需要私有属性是非常普遍的。事实上,如果你在控制器中没有私有属性,你可能会公开太多。这不像模型和视图类那样普遍。我怀疑这影响了他们的决定。也可能是拥有模板的不同人,或者他们在不同时间更新。有时,您会看到随着时间的推移而逐渐消除的小不一致。

您也可以制作自己的模板。请参阅创建自定义 Xcode 4 文件模板

于 2012-07-27T00:30:39.237 回答