Ответ
ARC (Automatic Reference Counting) применяется только для экземпляров ссылочных типов, то есть для классов (class).
Принцип работы: ARC автоматически подсчитывает сильные ссылки на объект в куче (heap) и освобождает память, когда счетчик достигает нуля.
Типы данных, для которых ARC НЕ используется:
- Структуры (struct) и перечисления (enum) — это типы-значения (value types). Они копируются при присваивании или передаче в функцию и обычно хранятся в стеке.
- Примитивные типы (Int, Double, Bool, String*).
*Примечание: String в Swift — это структура, но для эффективности использует copy-on-write и внутреннее хранение в куче. Управление этой памятью также не является прямой задачей ARC разработчика.
Пример, иллюстрирующий разницу:
// КЛАСС: использует ARC
class ReferenceType {
var value: Int
init(value: Int) { self.value = value }
}
var obj1 = ReferenceType(value: 10)
var obj2 = obj1 // Создается ССЫЛКА, ARC увеличивает счетчик.
obj2.value = 20
print(obj1.value) // 20 (изменился общий объект)
// СТРУКТУРА: ARC не используется
struct ValueType {
var value: Int
}
var struct1 = ValueType(value: 10)
var struct2 = struct1 // Создается ПОЛНАЯ КОПИЯ значения.
struct2.value = 20
print(struct1.value) // 10 (оригинал не изменился) Ответ 18+ 🔞
Смотри, тут про ARC, про эту автоматическую хуйню подсчёта ссылок. Так вот, слушай сюда, блядь, она работает только с классами, с этими самыми ссылочными типами.
Как оно, блядь, работает: Система тупо считает, сколько сильных ссылок висит на объект в куче, и когда счётчик доходит до нуля — пиздец объекту, память освобождается. Всё.
А теперь, блядь, для чего ARC НЕ используется, внимание:
- Структуры (struct) и перечисления (enum) — это, сука, типы-значения. Их просто копируют, когда ты их куда-то передаёшь, и живут они обычно в стеке, им этот ARC нахуй не упёрся.
- Примитивы всякие (Int, Double, Bool, String*).
*Заметка на полях: String в Swift — это структура, но хитрая жопа, она использует какую-то свою магию copy-on-write, чтобы не копировать всё подряд. Но это уже её внутренние дела, не наш, блядь, цирк.
Сейчас, ёпта, пример, чтобы совсем мозг не ебал:
// КЛАСС: тут ARC рулит
class ReferenceType {
var value: Int
init(value: Int) { self.value = value }
}
var obj1 = ReferenceType(value: 10)
var obj2 = obj1 // Тут не копия, а ссылка! ARC счётчик увеличил, блядь.
obj2.value = 20
print(obj1.value) // 20 (объект-то один на двоих, ебанашка!)
// СТРУКТУРА: тут ARC нихуя не делает
struct ValueType {
var value: Int
}
var struct1 = ValueType(value: 10)
var struct2 = struct1 // А вот тут — полная, блядь, копия значения! Разные сущности.
struct2.value = 20
print(struct1.value) // 10 (оригинал, сука, не тронут, живёт своей жизнью)
Вот и вся разница, пиздец. Классы — общие, со счётчиком. Структуры — каждый сам за себя, копия.