Когда в ARC (Swift) увеличивается счетчик ссылок на объект?

Ответ

Счетчик сильных ссылок увеличивается, когда на объект создается новая сильная (strong) ссылка. Это происходит автоматически в ARC при:

  1. Присваивании переменной:
    let object = MyClass() // Retain count = 1
    let anotherReference = object // Retain count = 2
  2. Передаче в функцию или замыкание (если параметр не помечен как weak/unowned):
    func process(obj: MyClass) { /* Retain count увеличивается на время вызова */ }
    process(obj: object)
  3. Добавлении в коллекцию (например, массив), которая хранит сильные ссылки:
    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 просто следит, сколько таких ответственных владельцев набралось. Когда последний владелец махнул рукой — объект отправляется в утиль. Всё, блядь, просто и гениально, как топор!