Sobes.tech
Middle

Wick ბმულებსა და Anound ბმულებს შორის რა განსხვავებაა?

sobes.tech AI

პასუხი AI-სგან

Wick-հղում (weak) — դա ոչ սեփականաշնորհված հղում է։ Այն չի ավելացնում օբյեկտի հղումների հաշվին։ Օգտագործվում է ուժեղ հղումների ցիկլերը կանխելու համար, օրինակ՝ դելեգատ և նրա սեփականատիրոջ միջև։ Եթե այն օբյեկտը, որի վրա ցույց է տալիս թույլ հղումը, դեալոկացվի, թույլ հղումը ավտոմատ կերպով կդառնա nil։

Unowned-հղում (unowned) — դա նույնպես ոչ սեփականաշնորհված հղում է և չի ավելացնում օբյեկտի հղումների հաշվին։ Տարբերությունն այն է, որ unowned չի կարող լինել ընտրական (Optional) և միշտ պետք է ցույց տա գոյություն ունեցող օբյեկտին։ Եթե այն օբյեկտը, որի վրա ցույց է տալիս unowned հղումը, դեալոկացվի այն ժամանակ, երբ հղումը դեռևս գոյություն ունի, փորձը այդ հղումին հասնելու հանգեցնի սխալի (фатալ սխալի)։ Օգտագործվում է այն դեպքում, երբ կապված օբյեկտի կյանքի ցիկլը երաշխավորված է երկար կամ հավասար unowned-հղում ունեցող օբյեկտի կյանքի ցիկլին (օրինակ՝ ուժեղ հղումների ցիկլ, որտեղ մեկ օբյեկտի կյանքը հստակ սահմանված է)։

Համեմատություն՝

Գծագիր weak unowned
Նվազեցումային Այո Այո
SC-ի ավելացում Ոչ Ոչ
Կարող է լինել nil Այո (ավտոմատ կերպով վերականգնվում է) Ոչ (պետք է ցույց տա օբյեկտին)
Անվտանգություն Ավելի անվտանգ, երբ հնարավոր է դեալոկացիա Ավելի քիչ անվտանգ (фатալ սխալ)
Տիպ Պետք է լինի ընտրական (Optional) Չի կարող լինել ընտրական
Օգտագործում Ուժեղ հղումների ցիկլերը կանխելու համար, երբ օբյեկտը կարող է վաղաժամ դեալոկացվել Ուժեղ հղումների ցիկլերը կանխելու համար, երբ օբյեկտը երաշխավորված է գոյություն ունենալու

Օրինակ՝ 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) ավարտեց գործել")
    }
}