启用ARC功能生成UUID字符串

71

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

经过一些研究,这就是我想到的:

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

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

3个回答

103

我觉得这很好。 这就是我使用的内容(可在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
@Artem NSProcessInfo 返回的是一个 String 而不是 UUID。此外,它仅保证对于同一进程是唯一的。如果您只需要一个唯一的字符串,那么它很有用。 - Abizern

42

我认为那看起来是正确的。

你已经使用CFRelease()释放了uuid,这是你从CFUUIDCreate()得到的责任。

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


7

Clang文档中得知:

(__bridge_transfer T)操作将操作数(必须具有不可保留指针类型)转换为目标类型(必须是可保留的对象指针类型)。ARC会在封闭完整表达式结束时释放该值,受本地值通常的优化限制。

所以您做得很对。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接