我需要在启用ARC的某些代码中生成UUID字符串。生成启用ARC的UUID字符串
之后做一些研究,这是我想出了:我用正确__bridge_transfer
避免泄漏ARC下的任何物体
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
是谁?
我需要在启用ARC的某些代码中生成UUID字符串。生成启用ARC的UUID字符串
之后做一些研究,这是我想出了:我用正确__bridge_transfer
避免泄漏ARC下的任何物体
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
是谁?
看起来很好。这是我使用(可作为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,而不必去到核心基础:
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)
运算连铸操作数,其必须具有非可保持指针类型,到目的地的类型,它必须是一个可保持对象指针类型。 ARC将在封闭的完整表达式的末尾释放该值,这取决于对本地值的通常优化。
所以你说得对。
对我来说这看起来是正确的。
你有CFRelease'd uuid
,这是从CFUUIDCreate()
你的责任,你传递的字符串ARC的所有权,所以编译器知道在适当的时候释放uuidStr
。
+1表示[NSProcessInfo worldwideUniqueString]指示。 – 2013-09-18 20:41:47