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