在 iOS 库中重命名 class 的最佳方法是什么?

What is the best way to rename a class in an iOS library?

如果我想重命名在我的 iOS 库中广泛使用并且其 API 也已公开的 class,最好的方法是什么?
理想情况下,我希望旧名称仍然存在,并标有弃用警告,以便人们可以优雅地切换到使用新语法。但是因为我不能同时保留两个 classes,所以我希望开发人员仍然能够使用已弃用的 API 但它在内部只是简单地调用自己的重命名版本。

我正在尝试 #define__attribute__((deprecated))@compatibility_alias,但没有找到一种方法来完成我想做的所有事情。

假设您要将 ABC 重命名为 XYZ

您可以使用重构工具(编辑 -> 重构 -> 重命名...)将 ABC 重命名为 XYZ。您可能还需要进行一些手动文件重命名。

如果您希望在重命名后仍然支持 ABC,您需要创建一个名为 ABC 的新 class,将消息转发到 XYZ。在新的 "fake" ABC class 上,将所有方法标记为已弃用。

您可以手动实现这些。或者,如果新 class 的结构没有根本不同,您可以使用 message forwarding:

However, before announcing the error, the runtime system gives the receiving object a second chance to handle the message.

基本上,不要在新 "fake" ABC 上实现方法 - 只需实现 forwardInvocation: 以将它们传递给正确的 class.

首先,您使用重构将您 class 重命名为新名称。 然后,您想支持旧名称但贬值,您可以使用 typedef 语句:

__attribute__((deprecated)) typedef NewClassName OldClassName;