Xcode现在生成一个空类别。为什么?

时间:2012-07-27 00:21:16

标签: objective-c xcode4.5

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

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

这意味着什么?现在让事情变得私密化了吗?我也注意到@private指令。

您的私人变量和方法的编码风格是什么?

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

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

1 个答案:

答案 0 :(得分:19)

您指的是此接口定义:

@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

但为什么呢?嗯,这些都是控制器,控制器需要私有属性是非常常见的。事实上,如果你在控制器中没有私有属性,你可能会过多地公开。这不是模型和视图类的通用。我怀疑这是他们的决定。它可能也是拥有模板的不同人,或者是在不同时间更新的。有时你会发现随着时间的推移会出现很少的不一致。

您也可以制作自己的模板。请参阅Creating Custom Xcode 4 File Templates