NSUUID冲突(iOS6.0及以上版本)

时间:2012-11-26 06:05:34

标签: objective-c ios

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

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

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

iOS 5.1及更低版本现已破裂。在iOS 5.1上,我们会在nil之后返回alloc/init

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

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

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

2 个答案:

答案 0 :(得分:9)

你做不到。你明确地打破了the rules

  

Objective-C类必须唯一地命名[...]为了保持   类名称唯一,约定是在所有类上使用前缀。   您通常会注意到Cocoa和Cocoa Touch类的名称   从NS或UI开始。像这样的双字母前缀是   由Apple保留用于框架类。

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

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

假设您实现了NSUUID,它实现了与#define NSUUID (NSClassFromString(@"NSUUID") ? [NSUUID class] : [NDRUUID class]) 相同的接口,那么最快的解决方案是在您的前缀标头中添加类似的内容:

[NSUUID UUID]

然后,您可以在代码中的其他任何位置使用NDRUUID等,就好像您只定位到iOS 6一样;唯一的区别是,当你在5岁以下的时候运行时,你实际上会解决{{1}}。每当你停止支持5时,只需从你的前缀标题中删除该行,并从项目中删除你自己的类。

希望您可以看到这是一种更好的方式来处理引入新的API和向后兼容性,比如说在任何地方都不使用Apple的NSUUID,直到它随处可用。

答案 1 :(得分:2)

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