How do I use CFArrayRef in Swift?

后端 未结 2 1681
鱼传尺愫
鱼传尺愫 2021-01-19 05:40

I\'m using an Objective-C class in my Swift project via a bridging header. The method signature looks something like this:

- (CFArrayRef)someMethod:(someType         


        
相关标签:
2条回答
  • 2021-01-19 06:21

    An Unmanaged is a wrapper for an actual CF value. (Sort of like an optional.) It's there because ARC can't tell from looking at the declaration of someMethod: whether that method retains the value it returns.

    You unwrap an Unmanaged by telling ARC what memory management policy to use for the value inside. If someMethod calls CFRetain on its return value:

    let cfArr = myInstance.someMethod(someValue).takeRetainedValue()
    

    If it doesn't:

    let cfArr = myInstance.someMethod(someValue).takeUnretainedValue()
    

    After you do that, cfArr is a CFArray, so you can use the bridging tricks from the other questions you linked to for accessing it like a Swift array.

    If you own the code for someMethod you can change it a bit to not need this. There's a couple of options for that:

    • Annotate with CF_RETURNS_RETAINED or CF_RETURNS_NOT_RETAINED to tell the compiler what memory behavior is needed
    • Since it's an ObjC method, bridge to NSArray and return that--it'll automatically become an [AnyObject] array in Swift.
    0 讨论(0)
  • 2021-01-19 06:40

    As explained in Working with Core Foundation Types, there are two possible solutions when you return a Core Foundation object from your own function that is imported in Swift:

    • Annotate the function with CF_RETURNS_RETAINED or CF_RETURNS_NOT_RETAINED. In your case:

      - (CFArrayRef)someMethod:(someType)someParameter CF_RETURNS_NOT_RETAINED;
      
    • Or convert the unmanaged object to a memory managed object with takeUnretainedValue() or takeRetainedValue() in Swift. In your case:

      var cfArr = myInstance.someMethod(someValue).takeUnretainedValue()
      
    0 讨论(0)
提交回复
热议问题