struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 10, y: 20) // Выделяется в стеке
var p2 = p1 // Создается полная копия
p2.x = 30 // p1.x остается 10
Особенности:
class Person {
var name: String
init(name: String) { self.name = name }
}
let person1 = Person(name: "Alice") // Выделяется в куче
let person2 = person1 // Копируется только ссылка
person2.name = "Bob" // Изменяет общий объект
Особенности:
Аспект | Value Type | Reference Type |
---|---|---|
Место хранения | Стек (обычно) | Куча |
Размер | Фиксированный | Динамический |
Доступ | Быстрее (прямой) | Медленнее (косвенный) |
Управление памятью | Автоматическое | Через ARC |
// Value Type пример
var a = [1, 2, 3]
var b = a
b.append(4)
// a остается [1, 2, 3], b становится [1, 2, 3, 4]
// Reference Type пример
let obj1 = NSMutableArray(array: [1, 2, 3])
let obj2 = obj1
obj2.add(4)
// obj1 и obj2 теперь оба [1, 2, 3, 4]
var largeArray1 = [Int](repeating: 0, count: 10000)
var largeArray2 = largeArray1 // Фактического копирования нет
largeArray2[0] = 1 // Реальное копирование происходит здесь
Применяется для:
struct Address { // Value Type
var street: String
}
class Person { // Reference Type
var address: Address
init(street: String) {
self.address = Address(street: street)
}
}
let person = Person(street: "Main St")
// Person в куче, Address внутри Person тоже в куче
Производительность:
Потокобезопасность:
Использование памяти:
Value Type хранятся в стеке и копируются при каждом присваивании, что делает их быстрыми и безопасными, но может привести к избыточному потреблению памяти. Reference Type хранятся в куче, передаются по ссылке и управляются через ARC, что удобно для больших данных, но требует внимания к управлению памятью и потокобезопасности. Выбор между ними должен основываться на конкретных требованиях к производительности и семантике работы с данными.