NSMakeCollectable和ARC不起作用

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).它们是等价的,所以你可以找到更具可读性的东西.


Rob*_*ier 8

将对象从中传输CFString到时NSString,需要让ARC知道如何处理内存管理.在这种情况下,我建议:

uuid = CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
Run Code Online (Sandbox Code Playgroud)

这指示CoreFoundation释放对象(平衡所需Create).Cocoa将在分配对象时保留对象uuid.