Sobes.tech
Middle

Wick шилтемелери менен Anound шилтемелери арасындагы айырма эмнеде?

sobes.tech AI

AIден жооп

Wick-ссылка (weak) — бул менчик эмес шилтеме. Ал объекттин шилтеме санын көбөйтпөйт. Ал күчтүү шилтемелер циклин алдын алуу үчүн колдонулат, мисалы, делегат жана анын ээси ортосунда. Эгерде слабо шилтеме көрсөтүп жаткан объект деструктурленсе, слабо шилтеме автоматтык түрдө nil болот.

Unowned-ссылка (unowned) — бул дагы менчик эмес шилтеме жана объекттин шилтеме санын көбөйтпөйт. weakтен айырмасы — unowned опционалдуу (Optional) боло албайт жана дайыма бар объектке шилтеме кылышы керек. Эгер unowned шилтемеси көрсөтүп жаткан объект деструктурленсе, ал учурда ага жетүү катага алып келет (фаталдык катта). Бул, байланышкан объекттин жашоо цикли анык жана узунураак же unowned шилтемеси бар объекттин жашоо циклине барабар деп кепилденген учурларда колдонулат (мисалы, күчтүү шилтемелер цикли, анда бир объекттин жашоо цикли так аныкталган).

Жалпылоо:

Өзгөчөлүк weak unowned
Менчик эмес Ооба Ооба
SC санын көбөйтөт Жок Жок
nil болушу мүмкүн Ооба (автоматтык түрдө нөлдөйт) Жок (объектке шилтеме кылышы керек)
Коопсуздук Мүмкүн деструктурлөнүүдө көбүрөөк коопсуз Аз коопсуз (фаталдык кат)
Тип Опционалдуу болушу керек Опционалдуу болбойт (өзүнчө)
Колдонуу күчтүү шилтемелер циклин алдын алуу үчүн, объект эрте жок болушу мүмкүн күчтүү шилтемелер циклин алдын алуу үчүн, объект кепилденген түрдө бар

weak колдонуу мисалы:

class Person {
    let name: String
    weak var apartment: Apartment? // циклин алдын алуу үчүн слабо шилтеме

    init(name: String) {
        self.name = name
        print("\(name) ишке кирди")
    }

    deinit {
        print("\(name) жыйынтыкталды")
    }
}

class Apartment {
    let unit: String
    var occupant: Person?

    init(unit: String) {
        self.unit = unit
        print("Apartment \(unit) ишке кирди")
    }

    deinit {
        print("Apartment \(unit) жыйынтыкталды")
    }
}

unowned колдонуу selfти жабуу үчүн:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = {
        [unowned self] in // unowned self цикл түзбөө үчүн
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) жыйынтыкталды")
    }
}