n.e*_*ind 23 iphone objective-c ios automatic-ref-counting
我正在尝试将旧项目转换为ARC.我有一个创建UUID的函数,但显然在使用ARC时不再支持:
NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
//[uuid autorelease];
CFRelease(theUUID);
}
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误(尝试转换时):'NSMakeCollectable'不可用:在自动引用计数模式下不可用.
所以我的问题是:如何在使用ARC时创建UUID?还有其他方法我现在应该使用吗?
Jon*_*pan 30
NSMakeCollectable()
是为了(基本上已弃用)Objective-C垃圾收集器的好处.ARC对此一无所知.
通常__bridge_transfer
,您必须使用特殊的cast属性来确保内存不会泄漏.__bridge_transfer
像这样使用:
id MakeUUID(void) {
id result = nil;
CFUUIDRef uuid = CFUUIDCreate(NULL);
if (uuid) {
result = (__bridge_transfer id)uuid; // this "transfers" a retain from CF's control to ARC's control.
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
编辑:正如其他答案所提到的,CFBridgingRelease()
这是为你做的.因此(__bridge_transfer id)uuid
,编写它可能更清晰,而不是使用CFBridgingRelease(uuid)
.它们是等价的,所以你可以找到更具可读性的东西.
将对象从中传输CFString
到时NSString
,需要让ARC知道如何处理内存管理.在这种情况下,我建议:
uuid = CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
Run Code Online (Sandbox Code Playgroud)
这指示CoreFoundation释放对象(平衡所需Create
).Cocoa将在分配对象时保留对象uuid
.
归档时间: |
|
查看次数: |
11757 次 |
最近记录: |