生成启用了ARC的UUID字符串

Abh*_*ert 71 objective-c automatic-ref-counting

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

做了一些研究之后,这就是我提出的:

CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
Run Code Online (Sandbox Code Playgroud)

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

Abi*_*ern 102

看起来很好.这是我使用的(作为要点)

- (NSString *)uuidString {
    // Returns a UUID

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

    return uuidString;
}
Run Code Online (Sandbox Code Playgroud)

编辑添加

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

NSString *uuidString = [[NSUUID UUID] UUIDString];
// Generates: 7E60066C-C7F3-438A-95B1-DDE8634E1072
Run Code Online (Sandbox Code Playgroud)

但总的来说,如果你只是想生成一个文件或目录名唯一的字符串,那么你可以使用NSProcessInfogloballyUniqueString方法,如:

NSString *uuidString = [[NSProcessInfo processInfo] globallyUniqueString];
// generates 56341C6E-35A7-4C97-9C5E-7AC79673EAB2-539-000001F95B327819
Run Code Online (Sandbox Code Playgroud)

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

  • 为[NSProcessInfo globalUniqueString]指示+1. (2认同)

Fir*_*eer 42

这对我来说是正确的.

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

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


iHu*_*ter 7

来自clang docs:

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

所以你做得对.