Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Swift : memory, weak, array

Как хранить weak-ссылки на объекты (например, UIViewControllers) в массиве?

Вопрос проверяет знание способов хранения слабых ссылок в коллекциях, которые по умолчанию хранят элементы сильно.

Короткий ответ

Обычный Swift-массив (Array) хранит сильные ссылки на объекты. Чтобы хранить weak-ссылки, можно использовать два основных подхода:

  1. Обертка (Wrapper): Создать структуру или класс-обертку, которая содержит weak-ссылку, и хранить эти обертки в массиве.

  2. NSPointerArray: Использовать класс из Foundation NSPointerArray, сконфигурированный для хранения weak-ссылок с помощью .weakMemory option.

Длинный ответ

Прямое добавление объекта в массив создает на него сильную ссылку, что может помешать освобождению памяти.

Способ 1: Обертка (Weak Reference Wrapper)

Создаем универсальную обертку, которая будет хранить weak-ссылку на любой объект.

class Weak<T: AnyObject> {
    weak var value: T?
    init(_ value: T) {
        self.value = value
    }
}

// Использование: храним массив оберток
var weakControllers: [Weak<UIViewController>] = []

let vc = UIViewController()
// Добавляем обертку со слабой ссылкой на vc
weakControllers.append(Weak(vc))

// Чтобы получить массив не-nil объектов, можно использовать compactMap
let activeControllers = weakControllers.compactMap { $0.value }

Способ 2: NSPointerArray

NSPointerArray — это мутабельный массив, аналогичный NSArray, но он может хранить указатели с разными правилами памяти.

// Создаем массив, который будет хранить weak-ссылки
let weakArray = NSPointerArray.weakObjects()

let object = NSObject()
// Добавляем объект. NSPointerArray будет хранить weak-ссылку.
weakArray.addPointer(Unmanaged.passUnretained(object).toOpaque())

// Когда object будет деинициализирован, указатель в массиве станет nil.
// При получении объектов нужно быть осторожным с указателями.

Подход с оберткой на чистом Swift часто предпочтительнее из-за большей типобезопасности и простоты.

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Swift

    Swift

Ключевые слова

#memory

#weak

#array

Подпишись на iOS Developer в телеграм