[swift-users] When does `Data.init?(capacity:)` fail?
Adrian Zubarev
adrian.zubarev at devandartist.com
Sun Jun 19 12:53:24 CDT 2016
I’ve got an answer on Twitter for that behavior: https://twitter.com/phausler/status/743927492096851969
I’ve anyone like me needs Data to have a specific capacity and still be non-optional, here is how I build a workaround (Data and Data.Deallocator aren’t fully implemented yet, thats why I’m using a custom deallocator rather then .free):
let capacity = 42 // or get the value somehow
let dataBufferPointer = UnsafeMutablePointer<UInt8>(allocatingCapacity: capacity)
dataBufferPointer.initialize(with: 0, count: capacity)
// do some work and mutation to the data here
let deallocator = Data.Deallocator.custom {
(buffer, _) in
free(buffer)
}
// this initializer says you should not mutate that data after constructing it
let data = Data(bytesNoCopy: dataBufferPointer, count: capacity, deallocator: deallocator)
--
Adrian Zubarev
Sent with Airmail
Am 19. Juni 2016 um 19:27:21, Saagar Jha (saagarjha28 at gmail.com) schrieb:
Not quite:
Swift’s policy on memory allocation failure is that fixed-size object allocation is considered to be a runtime failure if it cannot be handled. OTOH, APIs that can take a variable and arbitrarily large amount to allocate should be failable. NSData falls into the later category.
Source
On Sun, Jun 19, 2016 at 10:00 AM Karl <razielim at gmail.com> wrote:
As I understand it, that’s not an error in the ‘try’ sense of the word. If that failure happens, it’s a catastrophic issue which should bring down the application.
So the initialiser shouldn’t be failable; you’re right. File a bug at bugs.swift.org.
Karl
On 18 Jun 2016, at 06:06, Saagar Jha via swift-users <swift-users at swift.org> wrote:
This might be relavant. Basically, Data’s init will fail if memory can’t be allocated for it.
On Fri, Jun 17, 2016 at 11:38 AM Adrian Zubarev via swift-users <swift-users at swift.org> wrote:
Hello there, I’m trying to optimize my code and reduce copying from different buffers into a new one.
I thought I just create a Data value with enough capacity and write directly into it. My problem is that Data.init?(capacity:) can fail, but why and when?
Can someone explain this behavior to me?
I’m sending data via TCP sockets and when recn function write directly into a Data struct.
--
Adrian Zubarev
Sent with Airmail
_______________________________________________
swift-users mailing list
swift-users at swift.org
https://lists.swift.org/mailman/listinfo/swift-users
--
-Saagar Jha
_______________________________________________
swift-users mailing list
swift-users at swift.org
https://lists.swift.org/mailman/listinfo/swift-users
--
-Saagar Jha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160619/ede94d7d/attachment.html>
More information about the swift-users
mailing list