生成启用了ARC的UUID字符串

时间:2011-12-30 22:11:40

标签: objective-c automatic-ref-counting

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

在做了一些研究之后,我就想到了这个:

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

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

3 个答案:

答案 0 :(得分:102)

对我来说很好看。这就是我使用的(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

但主要是,如果您只想为文件或目录名生成唯一字符串,则可以使用NSProcessInfo的{​​{1}}方法,如:

globallyUniqueString

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

答案 1 :(得分:42)

这对我来说是正确的。

您已发送CF uuidCFUUIDCreate()

负责您的责任

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

答案 2 :(得分:7)

来自clang docs

  

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

所以你做得对。