Копирует ли конструктор данных Data байт, на которые он ссылается, если он инициирован с помощью `freeWhenDone: false`? - PullRequest
2 голосов
/ 10 апреля 2019

Если я выделю 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 для передачи байтов между функциями без копирования байтов.Но я бы с удовольствием упомянул любую документацию, опровергающую или подтверждающую эту теорию.

1 Ответ

0 голосов
/ 12 апреля 2019

Оказывается, ответ в документации в конце концов ... до тех пор, пока все ваши экземпляры данных let, и вы никогда не изменяете его, ТОЛЬКО оригинальные байты должны бытьв памяти все данные просто ссылаются на него.

Я мог бы просто использовать вместо этого NSData, так как это ссылочный тип и происходит меньше магии ...

Screenshot of documentation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...