繁体   English   中英

NSUUID冲突(iOS6.0及更高版本)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM