2012-07-27 46 views
6

我使用iOS6的Beta 3的Xcode现在生成一个空的类别。为什么?

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

这是什么意图在这里?现在有什么变化让事物变得私密了吗?我注意到@private指令也在那里。

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

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

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

+0

Rob的回复很好,但是......有没有人知道为什么XCode只为UIViewController的子类生成这个,而不是所有的类? (它可能为其他人做,但我延伸的通常类不显示此行为。) – VaporwareWolf 2012-07-27 00:48:57

回答

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

+0

完美答案。谢谢! – VaporwareWolf 2012-07-27 00:43:13

+0

@HCHogan如果回答了您的问题,请将其标记为答案(帖子左侧的复选标记)。谢谢。 – Stunner 2012-07-28 04:14:44

相关问题