Что такое Tagged Pointer в Objective-C/Swift?

«Что такое Tagged Pointer в Objective-C/Swift?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Tagged Pointer — это техника оптимизации памяти, при которой значение небольшого объекта (например, NSNumber, NSString, NSDate) хранится непосредственно в битах указателя, а не в отдельной области памяти (куче).

Как это работает:

  • Указатели в 64-битных системах часто выровнены (например, по 8 байт), поэтому несколько младших бит всегда равны нулю.
  • Эти «лишние» биты используются как тег (tag) для хранения типа объекта и его непосредственного значения.

Преимущества:

  1. Экономия памяти: Не требуется выделение отдельного блока в куче.
  2. Ускорение доступа: Устраняются накладные расходы на выделение/освобождение памяти и обращение к ней.
  3. Ускорение счетчика ссылок (ARC): Не нужен, так как объект «живет» в указателе.

Пример и проверка:

// Objective-C
NSNumber *smallNum = @42; // С высокой вероятностью будет tagged pointer
NSNumber *bigNum = @(INT_MAX); // Скорее всего, обычный объект в куче

// Проверка (функция из runtime)
BOOL isTagged = objc_isTaggedPointer((__bridge const void *)(smallNum));
// Swift
import Foundation
let smallNum: NSNumber = 42
// Косвенная проверка через описание объекта
print(smallNum) // Может показать специальное представление

Важное предупреждение: Не полагайтесь на внутреннее битовое представление Tagged Pointer — это деталь реализации, которая может меняться. Используйте только публичные API для работы с объектами.