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

时间:2012-11-25 17:07:43

标签: objective-c subclassing

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

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

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

是否有任何技术可以防止我的代码遇到这类问题?这可能发生在类别或(可能)其他事情上。

2 个答案:

答案 0 :(得分:6)

一个选项是为所有方法名称添加前缀。在扩展标准框架类时随时执行此操作。

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

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

答案 1 :(得分:1)

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

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

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

你将以艰难的方式建立经验(你现在就是这样做),就像我有一个名为description的非常重要的方法时那样。