[英]NSUUID conflict (iOS6.0 and Above)
我们有一个NSUUID类(我们提供了声明和实现)。 我们在iOS 6.0之前成功使用了它。 我们之所以实现它,是因为在苹果不推荐使用UIDevice uniqueIdentifier
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上,我们在alloc/init
之后返回nil
。
我尝试删除#if/#end
,但是使用最新的iPhone SDK时出现重复的名称。
苹果缺乏稳定的API是一个错误,而不是一个功能。 这种“在运行时尝试”废话并没有消除它。 这使得编写高完整性软件非常困难。
从以下Tommy的回复中,我无法指示Apple的工具链始终使用我们的NSUUID实现。 如何为iOS 5.1及更低版本提供NSUUID的实现(可能使用最新的SDK进行编译)?
你不能 您已经明确违反了规则 :
daccess-ods.un.org daccess-ods.un.org为了保持类名的唯一性,必须对Objective-C类进行唯一命名,惯例是在所有类上使用前缀。 您会注意到Cocoa和Cocoa Touch类名称通常以NS或UI开头。 Apple保留了此类的两个字母的前缀,供在框架类中使用。
您需要重命名自己的班级。 最快的方法很可能是右键单击类名称,选择“重构->重命名...”,这次使用正确的前缀。 Xcode可能无法完全自动重构,因为它显然在您代码的其他部分所指的是哪个NSUUID
是模棱两可的。
编辑:无论有NSUUID
,如果您想实现可提供NSUUID
自我替代功能的代码,那么该解决方案是“在运行时尝试”。
假设您实现了NDRUUID
,它实现了与NSUUID
相同的接口,那么最快的解决方案是在前缀标头中添加以下内容:
#define NSUUID (NSClassFromString(@"NSUUID") ? [NSUUID class] : [NDRUUID class])
然后,您可以在代码的其他任何地方使用[NSUUID UUID]
等,就好像您只针对iOS 6。 唯一的区别是,在5岁以下运行时,您实际上将寻址NDRUUID
。 每当您停止支持5时,只需从前缀标题中删除该行,然后从项目中删除您自己的类即可。
希望您能看到,这是处理引入新的API和向后兼容性的更好的方法,比之说,在任何地方都可以使用Apple的NSUUID之前,不要在任何地方使用它。
我已经完全按照您的要求构建了: NSUUID
于iOS 5.1及更低版本的NSUUID
的实现,可以使用最新的SDK进行编译。 在GitHub上查看我的NSUUID项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.