Если я выделю Data
объект с bytesNoCopy:count:deallocator:.none
, он должен ссылаться на заданные байты, но небезопасным образом, где я, как программист, обещаю, что байты будут доступны в течение времени жизни данных, а не данные, управляющие этимсам по себе.
Все хорошо.Что мне интересно ... Так как это тип значения, а не ссылочный тип, что произойдет, когда я назначу другую переменную Data из моих данных nocopy?Копирует ли он данные (вопреки моим явным желаниям)?Или это создает еще один небезопасный экземпляр данных, который я должен отслеживать время жизни, или рискует произойти сбой?
Вот иллюстрация:
let unsafe = malloc(5);
func makeUnsafeData() -> Data
{
return Data(bytesNoCopy: unsafe, count: 5, deallocator: .none)
}
struct Foo
{
var d: Data
}
var foo = Foo(d: makeUnsafeData())
free(unsafe)
Вопрос: содержит ли foo.dвисячий указатель на освобожденные байты, которые были в unsafe
?Или он содержит свою собственную копию этих байтов и безопасен для использования?
Суть этого эксперимента , по-видимому, указывает на то, что NSData дает сбой в вышеуказанном сценарии, как и ожидалось, но Data не делает;поэтому мой предварительный вывод заключается в том, что Data копирует данные, и невозможно использовать экземпляр Data для передачи байтов между функциями без копирования байтов.Но я бы с удовольствием упомянул любую документацию, опровергающую или подтверждающую эту теорию.