[swift-users] Passing a pointer to self to C function

John Brownie john_brownie at sil.org
Fri Sep 30 06:58:06 CDT 2016

Thanks! That works just as it should. It's all compiling and unit tests 
are passing, so I can move on now.
> Mike Ferenduros <mailto:mike.ferenduros at gmail.com>
> 30 September 2016 at 14:14
> The way to do this is via Unmanaged:
>     let raw = Unmanaged.passUnretained(expat).toOpaque()
> gets you an UnsafeMutableRawPointer you can pass into C functions. You 
> can turn this back into an ExpatSwift with
>     let expat = 
> Unmanaged<ExpatSwift>.fromOpaque(raw).takeUnretainedValue()
> There are also retained variants that will add or remove a reference 
> to the object in question.
> Basically, if you know that the pointer won't outlive the thing it 
> references, you want the unretained variants. This is usually what you 
> want when you're wrapping C APIs with callbacks, especially if 
> callbacks happen synchronously.
> On the other hand, if the pointer lives independently of the Whatever 
> then you may want to
>  - create the pointer with passRetained(), which will keep the object 
> it points to alive
>  - access the object with take*Un*retainedValue() (so you don't 
> prematurely release your reference to it), and
> - call release() on it when you're done with it.
> If you forget the 3rd step then you're leaking memory, and if you 
> miscalculate and do it twice then you crash.
> Or if you're just passing a pointer from A to B one time, you can use 
> passRetained() + takeRetainedValue().

John Brownie
In Finland on furlough from SIL Papua New Guinea
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160930/a3c41e94/attachment.html>

More information about the swift-users mailing list