4

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

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

childViewControllersiOS 5.0之前没有这个方法。我可以毫无顾虑地添加该方法。但是现在UIViewController有了一个带有名称的方法。如果我构建为 iOS 4.x 编写的遗留代码,该方法将被覆盖,它会产生不可预知的结果。

有什么技术可以保护我的代码免受此类问题的影响吗?这可能发生在类别或(也许)其他东西上。

4

2 回答 2

6

一种选择是为所有方法名称添加前缀。每当您扩展标准框架类时,请执行此操作。

由于没有像 Java 中那样的命名空间,因此同样的技术用于类名以避免将来可能发生的冲突。

这是另一个需要考虑的想法。这种情况多久发生一次?您需要权衡通过返回并重命名您的方法并更新受影响的代码来处理罕见的名称冲突与必须提出前缀命名方案并每天一遍又一遍地输入这些额外字符的努力。

于 2012-11-25T17:19:12.890 回答
1

在处理诸如 Obj-C 之类的后期绑定系统时,必须时刻警惕命名冲突。

不幸的是,这意味着您总是面临此类问题的风险。在这种情况下,您在 4.x 时代没有做错任何事。你所做的只是为一个好主意写一个好名字!但苹果也喜欢这个名字,他们的东西每次都会优先。你最好的办法是在你的类和方法名中添加一个前缀,特别是在扩展 Apple 的东西时。

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

你将以艰难的方式积累经验(你现在正在这样做),就像我在有一个非常重要的方法时所做的那样,称为description.

于 2012-11-25T17:29:48.830 回答