我需要在启用ARC的代码中生成一个UUID字符串。
经过一些研究,这就是我想到的:
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
我是否正确地使用__bridge_transfer
在ARC下避免泄露任何对象?
我需要在启用ARC的代码中生成一个UUID字符串。
经过一些研究,这就是我想到的:
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
我是否正确地使用__bridge_transfer
在ARC下避免泄露任何对象?
我觉得这很好。 这就是我使用的内容(可在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
的 globallyUniqueString
方法:
NSString *uuidString = [[NSProcessInfo processInfo] globallyUniqueString];
// generates 56341C6E-35A7-4C97-9C5E-7AC79673EAB2-539-000001F95B327819
虽然这不是一个正式的UUID,但它对于您的网络和进程是唯一的,并且在很多情况下是一个不错的选择。
我认为那看起来是正确的。
你已经使用CFRelease()
释放了uuid
,这是你从CFUUIDCreate()
得到的责任。
并且你已经将字符串的所有权转移给了ARC,因此编译器知道在适当的时间释放uuidStr
。
从Clang文档中得知:
(__bridge_transfer T)
操作将操作数(必须具有不可保留指针类型)转换为目标类型(必须是可保留的对象指针类型)。ARC会在封闭完整表达式结束时释放该值,受本地值通常的优化限制。
所以您做得很对。
NSUUID
和NSProcessInfo
生成的ID之间的主要区别是什么? - ArtemString
而不是UUID
。此外,它仅保证对于同一进程是唯一的。如果您只需要一个唯一的字符串,那么它很有用。 - Abizern