11.Toll-free bridging. Unmanaged

https://lvtao.net/tag/swift/

https://www.jianshu.com/p/ca7ccbf18d4e

非托管 免费桥接
1.Toll-free bridging:Core Foundation 和 Foundation 之间交换使用数据类型的技术就叫 Toll-Free Bridging.

object-c中ARC负责的只是nsobject的自动引用计数,因此对于CF对象无法内存管理,
我们在把对象在NS和CF之间进行转换时候,需要向编译器说明是否需要转移内存管理权,对于不涉及到内存管理转换的情况,在object-c直接在转换的时候__bridge 来进行说明,标示内存管理权不变,

2.System Sound Service播放音频:
AudioServiceCreateSystemSoundID (CFURLRef inFileURL ,SystemSoundID* ,outSystemSoundID)函数获得系统声音ID.

FB36C31F-01DF-4E74-97C5-665EA8C2E673.png
8EB2660E-7371-47E6-80AC-49F7B8CE8B77.png

1.NF和NS之间进行转换时候,需要向编译器说明是否需要转移管理权,对于不涉及到内存管理权的情况,__bridge.来进行说明。
表示内存管理权不变。 Swift CFURLRef typealias CFURL
2.在OC 时代ARC不能处理CF的创建和释放,create copy. Retain我们需要CFrelease来进行释放
3.在swift中 CF现在也在ARC的范围之内了。
可以自己管理的地方加上 CF_RETURN_RETAINED CF_RETURNS_NOT_RETAINED


9E419251-429D-4E78-9E2C-075861E48778.png

4.使用手动进行内存管理,一般来说会使用得到的unmanged对象的takeunretainedValue takeretaindvalu
takeunretainvalue 保持计数不变,如果需要自己管理使用takeRetainedValue来计数加一,unmanged中还提供
提供了retain,release,autorelease来提供我们使用。
CGimageRelease 也可用了,因为core foundation 内存也自动管理了。

5.unmanage 很少会用到,除非自己写的CF API
区分的方式: 当返回值是 Unmanaged的时候说明需要我们处理
处理方法: 在使用返回的值之前调用他对应的takeUnretainedValue() 或takeRetainedValue()即可
例如let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()
非托管对象
当 Swift 导入还尚未被注释的APIs时,编译器将不会自动地对返回的 Core Foundation 对象进行内存管理。Swift 将这些返回的 Core Foundation 对象封闭在一个Unmanaged结构中。那些间接返回 Core Foundation 的对象也是难以管理的。举个例子,这里有一个 unannotated 的 C 函数:
http://www.cocoachina.com/ios/20140613/8805.html

https://www.jianshu.com/p/23b44cd76ce6

https://www.jianshu.com/p/d57a5fd0677f

iOS通讯录

https://www.jianshu.com/p/b75c8a7dcd61

https://www.jianshu.com/p/d57a5fd0677

1.有用到:
let addressBook: ABAddressBook = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue()
bestFriendRecord: ABRecord = ABAddressBookGetPersonWithRecordID(addressBook, bestFriendID)?.takeUnretainedValue()
2.返回的是unmanaged


1B79C2D9-1DD6-496D-9161-EB83DD5F69C6.png

你可能感兴趣的:(11.Toll-free bridging. Unmanaged)