我们有一个NSUUID类(我们提供声明和实现)。我们在iOS 6.0上成功地使用了它。我们实现它是因为UIDevice uniqueIdentifier在苹果弃用它之前很久就被禁止了,而返回一个NSUUID是一个自然的选择。
在iOS 6.0中,我们不得不保护定义,因为苹果引入了相同的类:
#if __IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_5_1
@interface NSUUID : NSObject {
...
}
#endifiOS 5.1和更低版本现在被破坏了。在iOS 5.1上,我们在alloc/init之后返回nil。
我尝试删除#if/#end,但在使用最新的iPhone SDK时得到重复的名称。
苹果缺乏稳定的API是一个错误,而不是一个功能。这种“在运行时尝试”的废话并不能解决问题。这使得编写高完整性的软件变得非常困难。
从Tommy下面的回应来看,我不能指示Apple的工具链一直使用我们的NSUUID实现。如何为SDK5.1及更低版本提供NSUUID的实现(可能会使用最新的iOS编译)?
发布于 2012-11-26 14:11:44
你不能,你已经明确破坏了the rules
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,直到它到处可用。
发布于 2013-01-10 00:05:13
我已经构建了您所要求的:一个用于SDK5.1及更低版本的NSUUID实现,可以使用最新的iOS编译。在GitHub上查看我的NSUUID项目。
https://stackoverflow.com/questions/13559482
复制相似问题