Connect with us

TechHype

Вопросы с собеседований: В чем разница Weak и Unowned в Swift

В Swift weak и unowned — это два различных типа ссылок, которые позволяют избежать циклических зависимостей между объектами и предотвратить утечки памяти.

Фото аватара

Опубликовано

/

     
     

В Swift weak и unowned — это два различных типа ссылок, которые позволяют избежать циклических зависимостей между объектами и предотвратить утечки памяти.

Weak (Слабая ссылка):

  • weak используется, когда ссылка на объект не должна увеличивать счетчик ссылок объекта.
  • Если объект, на который указывает weak ссылка, был освобожден, weak ссылка автоматически становится nil.
  • Опциональный тип используется для weak ссылок, так как они могут быть автоматически устанавливаемыми в nil.
class Person {
    var apartment: Apartment?
}

class Apartment {
    weak var tenant: Person?
}

Unowned (Неудерживаемая ссылка):

  • unowned также не увеличивает счетчик ссылок объекта, но предполагается, что объект, на который указывает unowned ссылка, всегда существует (не может быть nil).
  • Если объект, на который указывает unowned ссылка, был освобожден, попытка доступа к этой ссылке приведет к краху приложения.
  • Используется, когда можно гарантировать, что объект, на который указывает ссылка, будет существовать до тех пор, пока существует unowned ссылка.
class Customer {
    var creditCard: CreditCard?
}

class CreditCard {
    unowned var owner: Customer
}

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

Аналог Weak и Unowned в Kotlin

В Kotlin аналоги слабых (Weak) и неудерживаемых (Unowned) ссылок примерно соответствуют следующим концепциям:

  • Слабые ссылки: В Kotlin, для реализации слабых ссылок, можно использовать WeakReference из стандартной библиотеки java.lang.ref. WeakReference позволяет создавать ссылки, которые не предотвращают утилизацию объекта сборщиком мусора.
import java.lang.ref.WeakReference

class Person(val name: String)

fun main() {
    val person = Person("John")
    val weakReference = WeakReference(person)

    // Используйте weakReference.get() для доступа к объекту
    val retrievedPerson = weakReference.get()
    println(retrievedPerson?.name) // Выводит "John"

    // Отсоединение сильной ссылки на объект
    person = null

    // Теперь retrievedPerson может быть null, если объект был собран сборщиком мусора
    println(retrievedPerson?.name) // Выводит null
}
  • Неудерживаемые ссылки: В Kotlin нет прямого эквивалента неудерживаемых ссылок (Unowned). Однако, можно использовать ссылку с использованием WeakReference в сценариях, когда можно гарантировать, что объект будет жив до момента использования ссылки.
import java.lang.ref.WeakReference

class Customer(val name: String)

class CreditCard(owner: Customer) {
    private val weakOwner = WeakReference(owner)

    fun getOwner(): Customer? {
        return weakOwner.get()
    }
}

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

Другие вопросы с собеседований.

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement

Наши партнеры:

LEGALBET

Мобильные приложения для ставок на спорт
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: