我正在尝试将我的旧项目转换为 ARC。我有一个创建 UUID 的函数,但显然这在使用 ARC 时不再受支持:
NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
//[uuid autorelease];
CFRelease(theUUID);
}
我收到编译器错误(尝试转换时):“NSMakeCollectable”不可用:在自动引用计数模式下不可用。
所以我的问题是:如何在使用 ARC 时创建 UUID?我现在应该使用另一种方式吗?
最佳答案
NSMakeCollectable()
是为了(基本上已弃用的)Objective-C 垃圾收集器的好处。 ARC 对此一无所知。
您必须使用特殊的转换属性,通常是__bridge_transfer
,以确保内存不泄漏。 __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;
}
编辑:正如其他答案所提到的,CFBridgingRelease()
会为您执行此操作。因此,与其使用 (__bridge_transfer id)uuid
,不如编写 CFBridgingRelease(uuid)
可能更简洁。不过它们是等价的,所以你觉得哪个更具可读性取决于你。
关于iphone - NSMakeCollectable 和 ARC 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594721/