【问题标题】:Objective-C subclassing and future compatibilityObjective-C 子类化和未来兼容性
【发布时间】:2012-11-25 17:07:42
【问题描述】:

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
  • 我主要关心名字冲突...即使方法同名,它的功能也可以完全不同。
  • 啊,我假设这些方法会做同样的事情

标签: objective-c subclassing


【解决方案1】:

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

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

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

【讨论】:

  • (+1) 另请参阅“可可编码指南”中的Private Methods,了解 Apple 对何时使用前缀的建议。
  • 我真的很想避免输入额外的字母和丑陋的下划线,但我认为没有正确性的美是程序的关键缺陷。无论如何,看起来没有什么可以保护我免受这种未来的名字冲突。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2012-06-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多