Специализация
Python Backend Developer
Java Backend Developer
Node.js Backend Developer
Golang Backend Developer
React Frontend Developer
Выберите навыки
React
JavaScript
Git
Redux
Webpack
Сложность
1-3
4-6
7-8
9-10
Рейтинг вопросов
1
2
3
4
5
Подпишись на React Developer в телеграм
WeakMap. В чем особенность? Какие свойства и методы есть? Как перебрать?
WeakMap — это коллекция пар ключ-значение, где ключи могут быть только объектами, а значения могут быть любого типа. Главная особенность WeakMap заключается в том, что он не удерживает сильные ссылки на ключи, что позволяет сборщику мусора автоматически очищать элементы, если на них больше нет ссылок. У WeakMap есть методы set(), get(), has() и delete(), однако его нельзя перебрать с помощью обычных методов, так как WeakMap не предоставляет итераторов.
WeakSet. В чем особенность? Какие свойства и методы есть? Как перебрать?
WeakSet — это коллекция уникальных объектов, где каждый объект хранится с использованием слабой ссылки. Главная особенность WeakSet заключается в том, что он не удерживает ссылки на свои элементы, что позволяет сборщику мусора автоматически удалять объекты, если на них больше нет ссылок. Методы WeakSet включают add(), delete() и has(), однако его нельзя перебрать, так как WeakSet не предоставляет итераторов.
В чём разница между weak и unowned? Где предпочтительнее использовать unowned?
weak хранит ссылку, которая автоматически обнуляется, когда объект деинициализируется, и требует опционального типа. unowned — неконтролируемая ссылка, не обнуляется и объявляется не-опциональным. unowned используют, когда зависимый объект гарантированно живет дольше или так же долго, как и владелец.
Почему unowned считается быстрее weak? Как это реализовано на уровне runtime?
weak ссылки требуют проверки и автоматического обнуления при деинициализации объекта, что добавляет накладные расходы на хранение в таблице слабых ссылок. unowned — обычный указатель без дополнительной обработки. В runtime это отличается отсутствием регистрации в weak-таблице и лишних проверок.
Как работает weak? Что происходит с weak ссылками, когда объект выгружается из памяти?
weak — это слабая ссылка, которая не увеличивает счетчик ссылок ARC. Если объект удаляется, weak-ссылка автоматически становится nil. Это помогает избежать циклов удержания.
Расскажи про strong, weak и unowned ссылки. Сравни weak и unowned.
Всегда ли в замыканиях нужно использовать [weak self]? (Нет, не всегда, только при риске цикла сильных ссылок)
Нужно ли использовать [weak self] внутри UIView.animate? (Нет)
Как хранить weak-ссылки на объекты (например, UIViewControllers) в массиве?
Почему weak является optional, а unowned — нет?
Рейтинг:
2
Сложность:
8
Strong ссылки увеличивают счётчик ссылок и удерживают объект в памяти. Weak ссылки не увеличивают счётчик и становятся nil, когда объект удаляется. Unowned ссылки также не увеличивают счётчик, но вызывают crash при обращении к удалённому объекту. Weak безопаснее, но unowned немного быстрее.
Рейтинг:
2
Сложность:
7
Нет, использовать [weak self] нужно не всегда. Это необходимо только в ситуациях, когда существует риск создания цикла сильных ссылок. Например, когда объект (как контроллер) хранит сильную ссылку на замыкание, а это замыкание захватывает self сильной ссылкой. Если замыкание будет выполнено сразу и не сохранено, цикл не образуется.
Рейтинг:
1
Сложность:
6
Нет, использовать [weak self] внутри UIView.animate(withDuration:animations:) не нужно. Система анимаций UIKit выполняет переданное замыкание и сразу освобождает его после завершения анимации. Это не приводит к созданию цикла сильных ссылок, так как замыкание не сохраняется надолго.
Рейтинг:
2
Сложность:
7
Обычный Swift-массив (Array) хранит сильные ссылки на объекты. Чтобы хранить weak-ссылки, можно использовать два основных подхода:
Обертка (Wrapper): Создать структуру или класс-обертку, которая содержит weak-ссылку, и хранить эти обертки в массиве.
NSPointerArray: Использовать класс из Foundation NSPointerArray, сконфигурированный для хранения weak-ссылок с помощью .weakMemory option.
Рейтинг:
4
Сложность:
6
weak ссылка может стать nil, если объект был освобожден. Поэтому она обязана быть optional. unowned предполагает, что объект всегда существует в момент обращения. Если объект будет освобожден раньше, приложение упадет. Это принципиальная разница в контракте использования.
Рейтинг:
5
Сложность:
8
Рейтинг:
5
Сложность:
8
Рейтинг:
2
Сложность:
7
Рейтинг:
2
Сложность:
6
Рейтинг:
2
Сложность:
5