我需要在启用ARC的某些代码中生成UUID字符串。
在做了一些研究之后,我就想到了这个:
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
我是否正确使用__bridge_transfer
来避免在ARC下泄漏任何对象?
答案 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 uuid
,CFUUIDCreate()
并且您已将字符串的所有权转移到ARC,因此编译器知道在适当的时间发布uuidStr
。
答案 2 :(得分:7)
来自clang docs:
(__bridge_transfer T)
op将操作数(必须具有不可保留的指针类型)强制转换为目标类型,该目标类型必须是可保留的对象指针类型。 ARC将在封闭的完整表达式的末尾释放值,这取决于对本地值的通常优化。
所以你做得对。