Всякий раз, когда я пытаюсь установить подмножество своего объекта данных, у меня происходит сбойЯ нашел способ обойти это, но для меня не имеет смысла, почему необходимость сделать это помогает решить проблему.
У меня есть объект данных длиной ровно 1000 байтов.
У меня есть ряд структур, которые перенаправляют этот объект в инициализатор другой структуры.
struct DataHeader {
let headerVal1: UInt16
let headerVal2: UInt32
init(withData: Data) {
var offset = 0
var length = MemoryLayout<UInt16>.size
headerVal1 = uint16Value(data: withData[offset..<length])
offset = length
length = MemoryLayout<UInt32>.size + offset
headerVal2 = uint32Value(data: withData[offset..<length])
}
}
struct DataBlock {
let dataVal1: UInt8
let dataVal2: UInt32
let dataVal3: Float
init(withData: Data) {
var offset = 0
var length = MemoryLayout<UInt8>.size
dataVal1 = uint8Value(data: withData[offset..<length])
offset = length
length = MemoryLayout<UInt32>.size + offset
dataVal2 = uint32Value(data: withData[offset..<length]) // <-- CRASH
offset = length
length = MemoryLayout<Float>.size + offset
dataVal3 = floatValue(data: withData[offset..<length])
}
}
struct EntireData {
let header: DataHeader
let block: DataBlock
// etc. continues for several other structures
init(withData: Data) {
var offset = 0
var length = MemoryLayout<DataHeader>.size
header = DataHeader(withData: withData[offset..<length])
offset = length
length = MemoryLayout<DataBlock>.size
block = DataBlock(withData: withData[offset..<length])
}
}
... в другом блоке кода, загружают данные из файла и передают в конструктор EntireData
.
Обратите внимание, что первое появление было в порядке.Сбой происходит после того, как код продолжается некоторое время.
Необычная часть, которую я не понимаю, и причина, по которой я задаю этот вопрос, заключается в том, что я нашел обходной путь.По сути, вместо использования withData
в конструкторах, сделайте его копию следующим образом:
let unnecessaryDataCopy = withData.advanced(by: 0)
Затем, используя unnecessaryDataCopy
вместо withData
в качестве аргументов вызова функции, проблем не будет.Система выполняется по точно таким же данным.Я знаю, что там есть данные, потому что есть сотни байтов, которые можно сэкономить.
Я не считаю правильным делать две копии данных только для доступа к ним.(Один с .advanced(by: 0)
и один с подмножеством ([смещение .. <длина])). </p>
Почему происходит сбой без ненужного DataCopy и что я могу сделать, чтобы сделать его лучше?Спасибо!