1

我们有一个 NSUUID 类(我们提供声明和实现)。我们成功使用它直到 iOS 6.0。我们实施它是因为UIDevice uniqueIdentifier早在 Apple 弃用它之前就被禁止了,并且返回 NSUUID 是一个自然的选择。

在 iOS 6.0 中,我们必须保护定义,因为 Apple 引入了相同的类:

#if __IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_5_1
@interface NSUUID : NSObject {
    ...
}
#endif

iOS 5.1 及更低版本现已损坏。在 iOS 5.1 上,我们nilalloc/init.

我尝试删除#if/#end,但在使用最新的 iPhone SDK 时出现重复名称。

Apple 缺乏稳定的 API 是错误,而不是功能。这种“在运行时尝试”的废话并没有削减它。这使得编写高完整性软件变得非常困难。

从下面 Tommy 的回复来看,我无法指示 Apple 的工具链一直使用我们的 NSUUID 实现。如何为 iOS 5.1 及更低版本(可能使用最新的 SDK 编译)提供 NSUUID 的实现?

4

2 回答 2

9

你不能。您已经明确违反了规则

Objective-C 类必须唯一命名 [...] 为了保持类名的唯一性,惯例是在所有类上使用前缀。您会注意到 Cocoa 和 Cocoa Touch 类名通常以 NS 或 UI 开头。像这样的两个字母前缀被 Apple 保留用于框架类。

您需要重命名自己的类。最快的方法很可能是右键单击类名,选择“Refactor -> Rename...”并这次使用正确的前缀。Xcode 可能无法完全自动重构,因为NSUUID您在代码的其他部分中所指的显然是模棱两可的。

编辑:不管哗众取宠,如果你想实现的代码为不可用的地方提供自我实现的替代品,NSUUID那么解决方案是“在运行时尝试”。

假设你已经实现NDRUUID了,它实现了相同的接口,NSUUID那么最快的解决方案就是在你的前缀头中添加这样的东西:

#define NSUUID (NSClassFromString(@"NSUUID") ? [NSUUID class] : [NDRUUID class])

[NSUUID UUID]然后,您可以在代码中的其他任何地方使用等,就好像您只针对 iOS 6 一样;唯一的区别是,当你在 5 下运行时,你实际上是在寻址NDRUUID. 每当您停止支持 5 时,只需从前缀标题中删除该行并从项目中删除您自己的类。

希望您能看到这是一种更好的方法来处理引入新的 API 和向后兼容性,而不是在任何地方都使用 Apple 的 NSUUID,直到它无处不在。

于 2012-11-26T06:11:44.150 回答
2

我已经完全按照您的要求构建了:NSUUID适用于 iOS 5.1 及更低版本的实现,可以使用最新的 SDK 进行编译。在 GitHub 上查看我的NSUUID项目。

于 2013-01-09T16:05:13.083 回答