美文网首页
11.Toll-free bridging. Unmanaged

11.Toll-free bridging. Unmanaged

作者: aofeilin | 来源:发表于2018-08-30 18:15 被阅读53次

    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<anyobject>


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

    相关文章

      网友评论

          本文标题:11.Toll-free bridging. Unmanaged

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