Objective-C的子类化和未来兼容性

4

Objective-C支持子类化和分类,允许您向现有类添加方法。这是我的情况。

// Made at earlier than iOS 5.x
@interface MyVC : UIViewController
- (void)childViewControllers;
@end

iOS 5.0之前没有childViewControllers方法。在不用担心的情况下,我可以添加该方法。但现在UIViewController有一个同名方法。如果我构建为iOS 4.x编写的旧代码,则该方法将被覆盖,这将导致不可预测的结果。

有没有什么技巧可以防止出现这种问题?这可能会发生在类别或(也许)其他地方。


你可以检查UIViewController是否实现了它,如果是,则调用super。 - DanZimm
1
我主要关注名称冲突问题...即使方法名称相同,其功能也可能完全不同。 - eonil
啊,我明白了,我以为这些方法会做同样的事情。 - DanZimm
2个回答

6
一种选择是给所有方法名添加前缀。每次扩展标准框架类时都要这样做。
类名也使用相同的技术,以避免将来可能发生的冲突,因为没有像Java那样的命名空间。
还有一个需要考虑的问题。这种情况有多常见?你需要权衡应对罕见名称冲突所需的工作量,包括返回并重命名方法以及更新受影响的代码,与每天必须想出前缀命名方案并输入这些额外字符的工作量。

3
请参考苹果公司的“Cocoa编码指南”中关于何时使用前缀的建议,了解更多关于"私有方法"的内容。查看私有方法章节。 - Martin R
1
我真的很想避免打多余的字母和丑陋的下划线,但我的观点是,美观而不正确是程序的致命缺陷。无论如何,看起来似乎没有什么可以保护我免受这种未来名称冲突的影响。 - eonil

1

在处理Obj-C等后期绑定系统时,对于命名冲突必须保持永久警惕。

不幸的是,这意味着您总是处于此类问题的风险之中。在这种情况下,您在4.x时代并没有做错任何事情。您所做的只是为一个好主意编写了一个好名称!但是苹果也喜欢那个名称,并且他们的东西每次都会优先考虑。当您扩展苹果的内容时,最好的选择是为您的类和方法名称添加前缀。

在这种情况下,只需重新命名您的方法即可。好消息是,在移动世界中,您无需在维护新应用程序版本的同时修补旧应用程序版本。在市场上,每次只能有一个版本的应用程序合法存在。这意味着您可以对代码库进行永久更改,而不必担心将更改保持在您的应用程序v5.1.6中,但不适用于v6.0.2。当用户更新时,他们总是更新到最新版本。

您将以艰难的方式积累经验(就像现在一样),就像我有一个非常重要的方法叫做description时一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接