2012-11-25 10 views
4

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

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

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

是否有任何技术来防御这类问题的代码?这可以发生在类别或(可能)其他东西。

+0

你可以检查是否UIViewController中实现它,如果这样称呼超级 – DanZimm

+1

我就主要讲述名称冲突......甚至,该方法具有相同的名称,它的功能可以完全不同。 – Eonil

+0

啊疑难杂症,我是假设的方法会做同样的事情 – DanZimm

回答

6

一个选项是为所有方法名称添加前缀。无论何时你扩展一个标准的框架类。

由于在Java中没有名称空间,因此对类名使用相同的技术以避免未来可能发生的冲突。

这是另一个需要考虑的问题。发生这种情况的频率如何?您需要重新评估处理罕见名称冲突的工作,方法是重新命名您的方法并更新受影响的代码,而不必重复提供前缀命名方案,并且每天都要反复输入这些额外的字符。

+3

(+1)也[私有方法]参见(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles /NamingMethods.html#//apple_ref/doc/uid/20001282-1003829)在“Cocoa的编码指南”中对于Apple的建议何时使用前缀。 –

+1

我真的很想避免输入多余的字母和丑陋的下划线,但我的观点是没有正确的美丽是程序的关键缺陷。无论如何,看起来没有什么可以保护我免受这种未来的名称冲突。 – Eonil

1

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

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

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

你会积累经验硬盘的方式(你现在做的),像我一样,当我有叫description一个非常重要的方法。