如何避免Objective-C中意外覆盖的方法或属性

例如,我subclassed UILabel并添加一个名为-verticalTextAlignment方法或属性来垂直alignment文本。
而在未来,如果下一个版本的SDK或iOS添加了一个同名的方法或属性,那么我的应用程序可能会崩溃或意外行为。

*即使您使用类别而不是子类,此问题发生。

问题1
Objective-C中如何避免这种意外覆盖?
我认为你可以通过前缀所有的方法和属性,如-XXX_verticalTextAlignment来避免这种-XXX_verticalTextAlignment 。 但这是不现实的,是吗?

问题2
我知道这种意外覆盖发生在编译时或更新iOS SDK,OSX SDK或XCode时。

但是,当更新你的iPhone的iOS版本时是否也可能发生?
例如,你的应用程序可能在iOS5上运行良好,但由于iOS6中的意外覆盖而不能在iOS6上运行(可以用​​任何版本replaceiOS5和iOS6,例如iOS5.0和iOS5.1)

  1. 是的,你可以使用自己的前缀,但是这是不常见的。

  2. 是的,它可能会在操作系统更新后发生。 Objective-C是一种非常dynamic的语言,与其他语言一样,消息被发送到方法而不是被调用。 这些东西是在运行时间,而不是编译时间。

底线是肯定的,你可能会意外地覆盖未来的基类方法,唯一的解决办法就是当它发生时重命名方法。

在每个不断增长的非名称空间cocoa生态系统中避免这些冲突是最安全的方法。

框架创build者,开源开发者和其他个人开发者应该为他们的类方法添加前缀是相当有效和合理的。

通常我会写下以我的公司名字为前缀的方法,然后继续使用该方法。

 - (void)JCMyMethodNamedSimilarToBaseClass; 

问题1a类别

使用前缀,或避免整个混乱,并使用function。

问题1b子类方法

如果一个方法做了足够的事情,超类也可以实现它,那么我简单的select一个比Apple常规select的方法名更“罗嗦”的方法名,例如在方法名中指定一个非标准的types名。 当然,这只会降低碰撞的可能性。

如果你需要更高级别的安全性,你可以在执行时testing这个(所以你知道什么时候被引入)并且希望每个用户保持更新 – 或者你可以更加依赖C和/或C ++没有这个问题)。

问题2

但是,当更新你的iPhone的iOS版本时是否也可能发生?

是。 这并不奇怪。 当框架更新时(例如通过软件更新),它们可能包含更新的框架。 这段代码被加载到objc运行时,并且总是获得已安装框架的objc实现版本。

这也是OS X上更广泛的问题,您可以在其中轻松加载代码和/或插件。

一个优雅的解决scheme是检查已经存在的方法,如果不是,则只添加它: 在山狮的条件类别