Работа с памятью
Как организована работа с памятью в операционной системе iOS?
В приложениях на Swift ARC управляет временем жизни экземпляров классов, удерживаемых сильными ссылками. Это механизм языка и среды выполнения, а не вся система управления памятью iOS. Операционная система также управляет виртуальной памятью, изоляцией процессов и реакцией на нехватку памяти.
Как работает автоматическое управление памятью (ARC) в iOS? Что означают атрибуты: weak, unowned, strong?
ARC в Swift и Objective-C управляет временем жизни объектов по сильным ссылкам. Когда сильных ссылок не остаётся, объект освобождается. Цикл сильных ссылок ARC самостоятельно не разрывает.
-
strong: Этот атрибут используется по умолчанию и создает сильную ссылку на объект, что предотвращает освобождение памяти до тех пор, пока существует хотя бы одна сильная ссылка на объект. -
weak: Создает слабую ссылку на объект, которая не увеличивает счетчик ссылок объекта. Если все сильные ссылки на объект исчезнут, объект будет автоматически освобожден из памяти, а слабая ссылка будет автоматически назначенаnil. -
unowned: Также создает ссылку на объект, но не увеличивает счетчик ссылок. Отличие отweakв том, чтоunownedпредполагает, что ссылка всегда будет иметь действительное значение, и не станетnilдо тех пор, пока объект жив. Если попытаться получить доступ кunownedссылке после того, как объект был освобожден, это приведет к аварийному завершению приложения.
Какие методы используются для предотвращения утечек памяти?
Для предотвращения утечек памяти в iOS можно использовать следующие методы:
-
Использование слабых
(weak)ссылок: Используйте слабые ссылки для предотвращения циклических ссылок между объектами. -
Освобождение ресурсов: Объявите deinit для завершающей очистки. Его не переопределяют через override. Если объект удерживается циклом сильных ссылок, deinit не вызовется, поэтому такой цикл нужно устранить отдельно.
-
Использование
Capture Listsдля замыканий: При использовании замыканий с внешним захватом объектов удостоверьтесь, что используете слабые ссылки или захватываете объекты с осторожностью, чтобы избежать циклических ссылок. -
Использование инструментов анализа памяти: В Xcode доступны инструменты анализа памяти, такие как Instruments, которые помогают обнаружить и исправить утечки памяти.
Что такое ARC (Automatic Reference Counting) и как он работает в Swift?
Automatic Reference Counting (ARC) — это
система управления памятью в Swift, которая автоматически подсчитывает
количество ссылок на каждый экземпляр объекта. Когда количество ссылок на объект
становится равно нулю, объект освобождается из памяти.
Пример:
class Person {
var name: String
init(name: String) {
self.name = name
print("\(name) is initialized")
}
deinit {
print("\(name) is deinitialized")
}
}
var person1: Person? = Person(name: "John")
person1 = nil // Здесь ARC освобождает память
В чем разница между strong, weak и unowned ссылками?
Разница между атрибутами:
-
strong: Ссылка, которая удерживает объект, увеличивая счетчик ссылок. Используется по умолчанию. -
weak: Ссылка не удерживает объект. После освобождения объекта сама слабая ссылка автоматически становится nil; это не изменение объекта.
-
unowned: Ссылка не удерживает объект и не обнуляется автоматически. Её используют, когда объект гарантированно жив при каждом обращении. Доступ после освобождения объекта через обычную unowned-ссылку вызывает ошибку времени выполнения.