gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:39:38 25 4
gpt4 key购买 nike

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

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

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

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

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

好吧,当我在 SecondViewController 中编写代码时,我放入 FirstViewController 的类扩展中的所有私有(private)方法都不会在自动完成中弹出。有点烦....

最佳答案

你指的是这个接口(interface)定义:

@interface MYViewController ()
@end

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

综上所述,您的观点是正确的。这用于定义私有(private)方法和属性。

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

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


编辑

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

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

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

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

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

关于objective-c - Xcode 现在生成一个空类别。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com