Ответ
Счетчик ссылок хранится в заголовке объекта (object header) — внутренней структуре данных, управляемой runtime.
Пример (Objective-C, для иллюстрации):
NSObject *obj = [[NSObject alloc] init];
// retainCount доступен, но его прямое использование не рекомендуется
NSUInteger count = [obj retainCount];
Ключевые моменты:
- В Swift счетчик ссылок полностью скрыт от разработчика.
- ARC (Automatic Reference Counting) автоматически управляет увеличением и уменьшением этого счетчика.
- Не следует полагаться на
retainCountв продакшн-коде, так как его значение может быть неточным из-за внутренних оптимизаций runtime. - Для
weak(слабых) ссылок используется отдельная структура — таблица слабых ссылок (weak table).
Ответ 18+ 🔞
Да ты посмотри, какая история-то, блядь! Всё это волшебство с памятью, эти объекты, которые живут-поживают — а за кулисами-то, сука, самый натуральный бухгалтерский учёт ведётся! Счётчик ссылок, ёпта!
Где он, спрашивается, прячется? Да прямо в заголовке объекта (object header), в этой самой внутренней кухне рантайма! Там у него своя контора, блядь, калькулятор и журнальчик: кто взял объект, кто отпустил.
Вот смотри, как это раньше, в старые добрые времена Objective-C, можно было подсмотреть, хотя тебе на это насрать и правильно делаешь:
NSObject *obj = [[NSObject alloc] init];
// retainCount доступен, но его прямое использование не рекомендуется
NSUInteger count = [obj retainCount];
Видал? Как будто спросил у объекта: «Ну что, дружок, сколько на тебя сейчас народу вешается?» А он тебе циферку и выдаст. Только вот это, блядь, прямой путь в ад! Потому что значение это может быть хуй пойми какое из-за оптимизаций — runtime там себе что-то по-тихому подкручивает, а ты везешься на эти цифры, как дурак.
А теперь главное, слушай сюда, в рот меня чих-пых:
- В Swift эту всю кухню наглухо заколотили досками. Никаких тебе подсмотров, никаких ручных манипуляций — сиди и радуйся жизни. Всё скрыто, блядь, как в танке.
- ARC (Automatic Reference Counting) — это тот самый автомат-бухгалтер, ёбаный в рот! Он сам, сука, следит: вот объект кому-то понадобился — чик (retain), вот перестал — чик (release). Считает, считает, и когда счётчик в ноль — хоба! — объект в утиль, память свободна. Красота!
- Запомни как «Отче наш»: никогда, блядь, НИКОГДА не лезь в продакшне смотреть
retainCount. Это как пытаться предсказать погоду по потрохам курицы — нихуя не выйдет, только обосрёшься. - А weak-ссылки, эти хитрожопые намёки на объект, они вообще в отдельной ведомости числятся — в таблице слабых ссылок (weak table). Чтобы, если главный объект помер, weak-ссылка автоматом в nil превратилась, а не тыкалась в пустоту, как слепая крот в асфальт.
Вот и вся магия, блядь. Сидишь ты, кодишь, а под капотом целый финансовый отдел трудится, чтобы твоя программа не накрылась медным тазом от утечек памяти. Ёперный театр!