我们有一个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编译)?
答案 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项目。