我在使用iOS6 beta 3时注意到了这一点
当我创建UIViewContoller的新子类(没有其他父类生成我注意到的这种行为)时,.m文件现在在文件顶部有一个空类别。在过去学习类别时,我注意到有些人会使用相同的技术来表示私有方法(虽然不是真正私有的)。
这意味着什么?现在让事情变得私密化了吗?我也注意到@private指令。
您的私人变量和方法的编码风格是什么?
更新:由于XCode正在推动我们使用类扩展,我继续将它们用于此项目的私有方法/ ivar。我发现了一个缺点。我看到我可以重用我的一个子类UIViewControllers以及它的所有UIButtons,UILabels等....我有这个继承: UIViewController< - FirstViewController< - SecondViewController。
好吧,当我在SecondViewController中编码时,我放在FirstViewController的类扩展中的所有私有方法都没有弹出自动完成。一点点烦恼....
答案 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。