> On 16 Jul 2016, at 22:16, Andrew Trick <atr...@apple.com> wrote: > > I don’t know what the recommended idiom is or if the syntax has changed from > Swift 2 to 3, but I would do something like this: > > withExtendedLifetime(data) { > let dataStart = UnsafePointer<CChar>(data.bytes) > myProcessdata1(dataStart,data.length) > }
I tried that but got a compiler crash (segmentation fault 11) So I improvised my own withExtendedLifetime by extending NSData with a doNothing() method which sets a field in a global struct. let dataStart = UnsafePointer<CChar>(data.bytes) myProcessdata1(dataStart,data.length) data.doNothing() but this didn’t help. Apparently this is not a lifetime bug. The code that crashed looked like this: init() throws { let data = ... do { try withExtendedLifetime(data) { let ptr = UnsafePointer<Int8>(data.bytes) do { try super.init(dataPtr:ptr, dataLength: data.length) ) } }} } Calling super.init in a closure is probably illegal anyway. I wonder, would Whole Module Optimization notice that doNothing() does nothing (i.e. the field in the global struct is never read) and remove it? Jan E. _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users