Ответ
Счетчик сильных ссылок увеличивается, когда на объект создается новая сильная (strong) ссылка. Это происходит автоматически в ARC при:
- Присваивании переменной:
let object = MyClass() // Retain count = 1 let anotherReference = object // Retain count = 2 - Передаче в функцию или замыкание (если параметр не помечен как
weak/unowned):func process(obj: MyClass) { /* Retain count увеличивается на время вызова */ } process(obj: object) - Добавлении в коллекцию (например, массив), которая хранит сильные ссылки:
var array = [MyClass]() array.append(object) // Retain count увеличивается
Важное уточнение: Счетчик увеличивается именно для сильных ссылок. Ссылки weak и unowned не увеличивают retain count, поэтому не предотвращают освобождение памяти.
Практическое правило: Рост счетчика — это «владение» объектом. Уменьшение (см. предыдущий вопрос) — это «отказ от владения».
Ответ 18+ 🔞
А, ну вот, подъехали к самому интересному, к механике, блядь! Счётчик сильных ссылок — это как талончики в столовой, только на объекты. И он растёт, сука, не просто так, а по чётким правилам, ёпта!
Смотри, как это работает, в рот меня чих-пых:
Ситуация первая, классика жанра. Ты создал объект — раз! Счётчик сразу в единицу.
let object = MyClass() // Счётчик: 1. Ты теперь его владелец, блядь, ответственный.
А потом ты такой: «О, классный объект!» — и присваиваешь его ещё одной переменной.
let anotherReference = object // Счётчик: 2. Теперь вас двое владельцев, как в коммуналке!
Вот это и есть новая сильная ссылка, ёбана! Система видит — ага, ещё один чувак заинтересован, чтобы этот объект жил. Прибавляет счётчик.
Ситуация вторая, передача в функцию. Ты вызываешь какую-нибудь функцию и суёшь туда свой объект.
func process(obj: MyClass) { /* внутри что-то делаем */ }
process(obj: object) // На время вызова функции счётчик тоже подрастёт!
Функция process получает свою собственную, блядь, сильную ссылку на этот объект. Пока она работает, она как бы говорит: «Не смей удалять эту хуйню, я ещё пользуюсь!». Потом, когда функция закончится, её ссылка уничтожится и счётчик упадёт. Автоматически, блядь!
Ситуация третья, коллекционер. Ты решил, что одному объекту скучно, и запихнул его в массив.
var array = [MyClass]()
array.append(object) // Счётчик: +1! Массив теперь тоже владелец.
Массив, сука, как шкатулка — он хранит внутри сильные ссылки на всё, что в него положили. Пока объект в массиве, счётчик не упадёт до нуля, даже если все твои переменные обнулятся. Массив его держит, ёпта!
А теперь, внимание, самый важный момент, который многие, блядь, пролетают мимо ушами, как фанера над Парижем!
Счётчик увеличивается ТОЛЬКО для сильных ссылок! Это как в лотерее, блядь. weak и unowned — это не полноценные билеты, это так, записочки. Они не дают права голоса! Создал слабую ссылку — счётчик не шелохнулся. Объект может в любой момент, сука, испариться, и слабая ссылка просто станет nil. Unowned — это вообще как долговая расписка от известного мошенника, блядь. Ты ссылаешься, но счётчик не растёт, и если объект удалится, а ты попробуешь к нему обратиться — ПИЗДЕЦ, краш приложения!
Практическое правило, которое надо выжечь в мозгу кислотой: Рост счётчика — это ты взял объект в собственность. «Это моё, я отвечаю». Уменьшение счётчика — это ты от собственности отказался. «Нате, забирайте, мне не надо». ARC просто следит, сколько таких ответственных владельцев набралось. Когда последний владелец махнул рукой — объект отправляется в утиль. Всё, блядь, просто и гениально, как топор!