我需要在启用了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下的任何对象?
Answers:
对我来说很好。这就是我所使用的(要点)
- (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,但对于您的网络和过程而言是唯一的,并且在许多情况下都是不错的选择。
(__bridge_transfer T)
op将必须具有不可保留指针类型的操作数转换为目标类型,该目标类型必须是可保留对象的指针类型。ARC将在封闭的全表达式结束时释放该值,但要对本地值进行通常的优化。
所以您做对了。