Toll-Free Brindging 和 Unmanaged

/// 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)