Abh*_*ert 71 objective-c automatic-ref-counting
我需要在启用ARC的某些代码中生成UUID字符串.
做了一些研究之后,这就是我提出的:
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *uuidStr = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
Run Code Online (Sandbox Code Playgroud)
我是否正确使用__bridge_transfer以避免在ARC下泄漏任何物体?
Abi*_*ern 102
看起来很好.这是我使用的(作为要点)
- (NSString *)uuidString {
// Returns a UUID
CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
CFRelease(uuid);
return uuidString;
}
Run Code Online (Sandbox Code Playgroud)
编辑添加
如果您使用的是OS X 10.8或iOS 6,则可以使用新的NSUUID类生成字符串UUID,而无需转到Core Foundation:
NSString *uuidString = [[NSUUID UUID] UUIDString];
// Generates: 7E60066C-C7F3-438A-95B1-DDE8634E1072
Run Code Online (Sandbox Code Playgroud)
但总的来说,如果你只是想生成一个文件或目录名唯一的字符串,那么你可以使用NSProcessInfo的globallyUniqueString方法,如:
NSString *uuidString = [[NSProcessInfo processInfo] globallyUniqueString];
// generates 56341C6E-35A7-4C97-9C5E-7AC79673EAB2-539-000001F95B327819
Run Code Online (Sandbox Code Playgroud)
它不是一个正式的UUID,但它对您的网络和流程来说是独一无二的,并且是很多情况下的不错选择.
Fir*_*eer 42
这对我来说是正确的.
你有CFRelease'd uuid,这是你的责任CFUUIDCreate()
并且您已将字符串的所有权转移到ARC,因此编译器知道uuidStr在适当的时间发布.
来自clang docs:
(__bridge_transfer T)op将必须具有不可保留指针类型的操作数强制转换为目标类型,该目标类型必须是可保留的对象指针类型.ARC将在封闭的完整表达式的末尾释放值,这取决于对本地值的通常优化.
所以你做得对.
| 归档时间: |
|
| 查看次数: |
28066 次 |
| 最近记录: |