生成启用ARC的UUIDstring

我需要在启用ARC的某些代码中生成一个UUIDstring。

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

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

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

对我看起来很好。 这是我使用(作为要点可用)

 - (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类生成stringUUID,而无需转到Core Foundation:

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

但是大多数情况下,如果您只是想为文件或目录名称生成一个唯一的string,那么您可以使用NSProcessInfo方法,如:

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

这不是一个正式的UUID,但是它对于你的networking和你的过程来说是独一无二的,对于很多情况来说是一个不错的select。

这对我来说是正确的。

你有CFRelease'd uuid ,这是你从CFUUIDCreate()

而且你已经把string的所有权转给了ARC,所以编译器知道在适当的时候释放uuidStr

从clang文档 :

(__bridge_transfer T)将必须具有不可保留指针types的操作数强制转换为目标types,该types必须是可保留的对象指针types。 ARC将在封闭的完整expression式的末尾释放该值,受当地值的通常优化。

所以你做对了。