生成启用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式的末尾释放该值,受当地值的通常优化。
所以你做对了。