Подсчет ссылок Swift Struct
У меня есть вопрос о структуре
В WWDC2016 сеанс рекомендует использовать sturct (тип значения)
но если в структурах есть еще 3 встроенных переменных слова, структура должна управлять счетчиком ссылок как большим значением в куче
тогда мой вопрос
когда у структуры есть 3 другой структуры, и у каждой структуры есть 2 или 3 другой тип структуры или значения
Я хочу знать, как это работает, используя счетчик ссылок или нет в этой ситуации
ниже приведен пример структур
struct ViewModel {
var titleModel: TitleModel
var contentModel: ContentModel
var layoutModel: LayoutModel
}
struct TitleModel {
var text: String
var width: Float
var height: Float
}
struct ContentModel {
var content: String
var width: Float
var height: Float
}
struct LayoutModel {
var constant: Float
var multiply: Float
}
2 ответа
Структуры и перечисления имеют семантику значений. Не существует понятия количества ссылок, потому что они передаются путем копирования. Их члены могут быть указателями на ссылочные типы, но сам указатель копируется. Пока у вас нет ссылочного типа в структуре, вам не нужно беспокоиться о подсчете ссылок.
Конечно, можно утверждать, что Swift внутренне использует оптимизации копирования при записи, используя ссылочные типы, замаскированные под структуры (например, Array
, Dictionary
и т.д.), но они реализуют семантику значения.
Посмотрите эти числа размеров ваших структур.
print(sizeof(ViewModel)) //->72 == sizeof(TitleModel) + sizeof(ContentModel) + sizeof(LayoutModel)
print(sizeof(TitleModel)) //->32 == sizeof(String) + sizeof(Float) + sizeof(Float)
print(sizeof(ContentModel)) //->32 == sizeof(String) + sizeof(Float) + sizeof(Float)
print(sizeof(String)) //->24 (a mystery...)
print(sizeof(LayoutModel)) //->8 == sizeof(Float) + sizeof(Float)
(sizeof(String)
кажется "загадкой", но это также другая проблема.)
Swift не дает нам никаких гарантий относительно распределения элементов в структуре, но, на данный момент, Swift распределяет все элементы способом "плоский и естественный".
ViewModel:
offset content size
0 TitleModel.text 24
24 TitleModel.width 4
28 TitleModel.heigth 4
32 ContentModel.content 24
56 ContentModel.width 4
60 ContentModel.height 4
64 LayoutModel.constant 4
68 LayoutModel.multiply 4
--
72 Total(=sizeof(ViewModel))
Ваш ViewModel
не содержит ссылок на своих членов. Он просто держит своих членов внутри. Нет ссылок, так что нет ссылок.
У вас может возникнуть вопрос о том, как управляются структуры, когда они действительно содержат некоторые ссылки. Но это другая проблема, чем ваша when struct have 3 another struct and each struct have 2 or 3 another struct or value type
,