美文网首页
Toll-Free Brindging 和 Unmanaged

Toll-Free Brindging 和 Unmanaged

作者: fordring2008 | 来源:发表于2017-02-05 12:26 被阅读51次

    /// NSURL 转换成 CFURLRef    

    NSURL *fileURL = [NSURL URLWithString:@"SomeURL"];    

    SystemSoundID theSoundID;    

    OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &theSoundID);       

     import AudioToolboxlet 

    fileURL = NSURL(string: "SomeURL")

    var theSoundID: 

    SystemSoundID = 0AudioServicesCreateSystemSoundID(fileURL!, &theSoundID)

    // OC 中 CFURLRef 被重新命名为 Swift 中 CFURL, 主要是为了减少了API的迷惑// 使用 CF 类型的说,Cocoa的原理是在合适的地方加入了 CF_RETURNS_RETAINED 和 CF_RETURNS_NOT_RETAINED 这样的标注// 当第三方的非系统的 CF API,如果没有明确地使用上面的标注,将这些返回 CF 对象的 API 导入 SWift时,他们的类型是被对应为 Unmanaged// 这个时候就需要我们需要手动进行内存管理, 会用到 Unmanaged对象的 takeUnretainedValue 或者 takeRetainedValue 从中取出需要的CF对象,并同时处理引用计数。 takeUnretainedValue 将爆出原来的引用计数不变,在没有义务去释放原来的内存时使用。takeRetainedValue 来让引用计数加1,然后在使用完成后对原来的 Unmanaged 进行手动释放。为了能手动操作 Unmanaged 的引用计数, Unmanaged 还提供了 retain, release 和 autorelease 方法/*    CFGetSomething() -> UnmanagedCFCreateSomething() -> Unmanaged两者都没有进行标注, Create 中进行了创建

    */

    let unmanaged = CFGetSomething()

    let something = unmanaged.takeUnretainedValue()

    let unmanaged1 = CFCreateSomething()

    let something1 = unmanaged1.takeRetainedValue() // 这里 retain

    // 使用 something1

    // 这里释放

    unmanaged1.release()

    // 以上 Create  release 这些方法只有在手写 CF API 的话,就没有必要关心这些

    相关文章

      网友评论

          本文标题:Toll-Free Brindging 和 Unmanaged

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