生成启用 ARC 的 UUID 字符串

Posted

技术标签:

【中文标题】生成启用 ARC 的 UUID 字符串【英文标题】:Generate a UUID string with ARC enabled 【发布时间】:2012-01-30 20:33:38 【问题描述】:

我需要在启用 ARC 的某些代码中生成 UUID 字符串。

在做了一些研究之后,这是我想出的:

CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);

我是否正确使用__bridge_transfer 以避免在 ARC 下泄漏任何对象?

【问题讨论】:

【参考方案1】:

我觉得不错。这就是我使用的(以gist 的形式提供)

- (NSString *)uuidString 
    // Returns a UUID

    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
    NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
    CFRelease(uuid);

    return uuidString;

编辑添加

如果您使用的是 OS X 10.8 或 ios 6,则可以使用新的 NSUUID 类生成字符串 UUID,而无需转到 Core Foundation:

NSString *uuidString = [[NSUUID UUID] UUIDString];
// Generates: 7E60066C-C7F3-438A-95B1-DDE8634E1072

但大多数情况下,如果您只想为文件或目录名称生成唯一字符串,则可以使用NSProcessInfogloballyUniqueString 方法,例如:

NSString *uuidString = [[NSProcessInfo processInfo] globallyUniqueString];
// generates 56341C6E-35A7-4C97-9C5E-7AC79673EAB2-539-000001F95B327819

它不是一个正式的 UUID,但它对于您的网络和您的流程来说是独一无二的,并且是很多情况下的不错选择。

【讨论】:

嗨!非常感谢您的回答。但是使用NSUUIDNSProcessInfo 生成的ID 之间的主要区别是什么? @Artem NSProcessInfo 返回 String 而不是 UUID。此外,它只保证对于同一进程是唯一的。如果您只需要一个唯一的字符串,这很有用。【参考方案2】:

这对我来说是正确的。

你有 CFRelease'd uuid,这是 CFUUIDCreate() 的责任

并且您已将字符串的所有权转移给 ARC,因此编译器知道在适当的时间释放 uuidStr

【讨论】:

【参考方案3】:

来自clang docs:

(__bridge_transfer T) op 将必须具有不可保留指针类型的操作数强制转换为目标类型,该目标类型必须是可保留对象指针类型。 ARC 将在封闭的完整表达式的末尾释放值,但要对局部值进行通常的优化。

所以你做对了。

【讨论】:

以上是关于生成启用 ARC 的 UUID 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何生成uuid oracle

Rails + UUID 生成的模式假定 UUID 是整数而不是字符串

oracle随机uuid字符串生成函数

Django生成唯一字符串UUID与MD5

js生成uuid

java 生成UUID重复