美文网首页
CF 对象无法进行内存管理

CF 对象无法进行内存管理

作者: XLsn0w | 来源:发表于2019-12-20 10:34 被阅读0次

Cocoa 框架中的大部分 NS 开头的类其实在 CF 中都有对应的类型存在,可以说 NS 只是对 CF 在更高层面的一个封装。比如 NSURL 和它在 CF 中的 CFURLRef 内存结构其实是同样的,而 NSString 则对应着 CFStringRef。

因为在 Objective-C 中 ARC 负责的只是 NSObject 的自动引用计数,因此对于 CF 对象无法进行内存管理。我们在把对象在 NS 和 CF 之间进行转换时,需要向编译器说明是否需要转移内存的管理权。对于不涉及到内存管理转换的情况,在 Objective-C 中我们就直接在转换的时候加上 __bridge 来进行说明,表示内存管理权不变。例如有一个 API 需要 CFURLRef,而我们有一个 ARC 管理的 NSURL 对象的话,这样来完成类型转换:

NSURL*fileURL=[NSURLURLWithString:@"SomeURL"];SystemSoundIDtheSoundID;//OSStatus AudioServicesCreateSystemSoundID(CFURLRef inFileURL,//                            SystemSoundID *outSystemSoundID);OSStatuserror=AudioServicesCreateSystemSoundID((__bridgeCFURLRef)fileURL,&theSoundID);

而在 Swift 中,这样的转换可以直接省掉了,上面的代码可以写为下面的形式,简单了许多:

importAudioToolbox

let fileURL=NSURL(string:"SomeURL")

var theSoundID:SystemSoundID=0   //AudioServicesCreateSystemSoundID(inFileURL: CFURL,//        _ outSystemSoundID: UnsafeMutablePointer<SystemSoundID>) -> OSStatusAudioServicesCreateSystemSoundID(fileURL!,&theSoundID)

相关文章

  • CF 对象无法进行内存管理

    Cocoa 框架中的大部分NS开头的类其实在 CF 中都有对应的类型存在,可以说NS只是对 CF 在更高层面的一个...

  • ARC下OC 对象和 CF 对象之间的桥接(__bridge)

    首先需要说明的是:ARC 环境下编译器不会自动管理 CF 对象的内存,所以当创建一个 CF 对象时,使用结束后要用...

  • iOS 中堆和栈的区别以及冒泡排序

    在引入堆和栈之前,先要知道,iOS中的内存管理范围: OC对象需要进行内存管理,非oc对象不需要进行内存管理,比如...

  • iOS 的内存管理(ARC)

    基本概念 首先,那些对象才需要我们进行内存管理呢? 任何继承了NSObject的对象需要进行内存管理 而其他非对象...

  • MRC、ARC内存管理机制

    MRC、ARC内存管理机制?(为什么要进行内存管理, 内存管理的范围和对象, 内存管理的原理) ** (为什么)...

  • OC关于在MRC模式下的内存管理学习

    内存管理 管理范围 任何继承NSObject的对象 只有OC对象才需要进行内存管理的本质原理 1.OC对象在堆中 ...

  • iOS面试题

    1堆和栈的区别 1.内存管理范围 只有oc对象需要进行内存管理非oc对象类型比如基本数据类型不需要进行内存管理 2...

  • QY__

    1.堆和栈的区别 1.内存管理范围 只有oc对象需要进行内存管理 2.内存管理本质 因为:Obje...

  • 【问答】补充

    Java JVM如何管理内存的? Java中内存管理是JVM自动进行的,创建对象或者变量时JVM会自动分配内存,当...

  • iOS 内存管理

    1、只有OC对象才需要进行内存管理 1、OC对象存在堆中 2、非OC对象存在栈中(内存会被系统自动收回) ...

网友评论

      本文标题:CF 对象无法进行内存管理

      本文链接:https://www.haomeiwen.com/subject/vfmbnctx.html