Встречается на 27% собеседований по Mobile

Что такое модификатор памяти weak

Модификатор памяти `weak` используется для предотвращения так называемых "сильных ссылочных циклов" (strong reference cycles) между экземплярами классов. Возникают, когда два объекта взаимно ссылаются друг на друга сильными ссылками, что препятствует автоматическому подсчёту ссылок (Automatic Reference Counting, ARC) корректно управлять памятью и освобождать эти объекты.

Как он работаетСоздаёт "слабую ссылку" на объект, в отличие от обычной "сильной ссылки". Удерживают объект в памяти, пока на него существует хотя бы одна такая ссылка. В отличие от них, слабые ссылки не увеличивают счётчик ссылок объекта, к которому они относятся. Это означает, что объект может быть освобождён из памяти, даже если на него существуют слабые ссылки.

text
```swift
class Person {
    var name: String
    var pet: Pet?

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) is being deinitialized")
    }
}

class Pet {
    var name: String
    weak var owner: Person?

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) is being deinitialized")
    }
}

var john: Person? = Person(name: "John")
var dog: Pet? = Pet(name: "Fido")

john?.pet = dog
dog?.owner = john

john = nil
dog = nil
```

В этом примере, если бы `owner` в классе `Pet` был сильной ссылкой, установка `john = nil` и `dog = nil` не привела бы к освобождению памяти, занимаемой этими объектами, потому что они бы продолжали ссылаться друг на друга. Однако, поскольку `owner` является слабой ссылкой, освобождение `john` не мешает автоматическому освобождению `dog`.

Зачем его использовать

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

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

April 23, 2024, easyoffer

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы