生成启用了ARC的UUID字符串


71

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

经过研究,这是我想出的:

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

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

Answers:


102

对我来说很好。这就是我所使用的(要点

- (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,但对于您的网络和过程而言是唯一的,并且在许多情况下都是不错的选择。


42

在我看来,这是正确的。

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

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


7

clang docs

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

所以您做对了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.