/// 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 的话,就没有必要关心这些
网友评论