iphone - NSMakeCollectable 和 ARC 不起作用

标签 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);
    }

我收到编译器错误(尝试转换时):“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/

相关文章:

iphone - 使用核心运动和陀螺仪找出 [x,y] 平面上的变化

iphone - AFNetworking 监控所有下载过程

iphone - 核心数据 : Why removing the sqlite file did not clear all the previous data insert immediately?

ios - 在我的应用程序中播放声音后如何在 xcode 中重新启动音乐播放器

ios - CIDetector featuresInImage 返回 0

ios - 如何将图像加载到 iOS 应用程序中

ios - 如何快速从父子关系中的父级获取子级

ios - 如何按修改日期对 CloudKit 结果进行排序?

ios - .xib 文件名在创建包时更改为 ~iphone.nib

objective-c - NSScrollView 内容和滚动条插图