Sobes.tech
Back to questions
Junior — Middle
75

Чем отличаются терминологии weak, strong и unowned в контексте управления памятью в программировании?

Companies where asked
WildberriesWildberries
AppMaster
Uzum
VKVK

Answer from AI

sobes.tech AI

В контексте управления памятью в Swift (iOS) термины weak, strong и unowned относятся к типам ссылок, которые влияют на подсчет ссылок (ARC) и помогают избежать циклов удержания (retain cycles).

  • strong — это обычная сильная ссылка, которая увеличивает счетчик ссылок объекта. Пока есть хотя бы одна сильная ссылка, объект не будет удалён из памяти.

  • weak — слабая ссылка, которая не увеличивает счетчик ссылок. Она используется, чтобы избежать циклов удержания. Слабая ссылка автоматически становится nil, когда объект, на который она ссылается, удаляется из памяти. Поэтому weak свойства должны быть опциональными.

  • unowned — также не увеличивает счетчик ссылок, но в отличие от weak, не является опциональной и не становится nil. Предполагается, что объект, на который ссылается unowned, будет существовать дольше, чем ссылка. Если объект удаляется, а unowned ссылка используется, произойдет ошибка времени выполнения.

Пример:

class Person {
    var name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
}

class Apartment {
    let unit: String
    unowned let tenant: Person
    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
    }
}

let john = Person(name: "John")
let apt = Apartment(unit: "4A", tenant: john)
john.apartment = apt

Здесь tenantunowned, так как Apartment не должен удерживать Person сильной ссылкой, но Person гарантированно существует дольше Apartment.

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