Middle
Чӣ гуна метавон аз пайдоиши давраи нигоҳдорӣ (retain cycle) дар iOS пешгирӣ кард?
sobes.tech AI
Ҷавоб аз AI
Циклҳои нигоҳдорӣ бо истифодаи дуруст аз референсҳои заъф (weak) ё бе шарт (unowned) пешгирӣ мешаванд.
Референсҳои заъф (weak):
- Ҳисобкунаки референсҳоро зиёд намекунанд.
- Метавонанд
nilшаванд. - Вале, вақте як объект метавонад мустақилона вуҷуд дошта бошад (масалан, делегат).
class DelegateExample {
weak var delegate: SomeDelegateType? // Референси заъф ба делегат
}
Референсҳои бе шарт (unowned):
- Ҳисобкунаки референсҳоро зиёд намекунанд.
- Бе шарт ва кафолатнок нест, ки
nilшавад. - Вале, вақте як объект равшан соҳиби дигар аст, аммо объекти вобаста метавонад танҳо бо соҳиби вуҷуд дошта бошад (масалан, бастаҳо, даргиронии
selfдар класс, ки баста равшан "медонад" ки ба экземпляри класс тааллуқ дорад). Агар ба референсиunownedдастрасӣ шавад ва объект аллакай озод карда шуда бошад, хатогӣ ба амал меояд.
class Owner {
var closure: (() -> Void)?
func setupClosure() {
closure = { [unowned self] in // Референси бе шарт ба self
// Истифодаи self
print("Истифодаи unowned self")
}
}
}
Истифода дар бастаҳо:
Бастаҳо метавонанд циклҳои нигоҳдорӣ эҷод кунанд, агар онҳо намунаҳои классҳоро бо референси қавӣ дар бар гиранд, ва он намунаи класс низ дорои референси қавӣ ба баста мебошад. Барои пешгирӣ, истифода мешавад рӯйхати захираҳо (capture lists) дар оғози баста:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = { [weak self] in // Референси заъф ба self
guard let strongSelf = self else {
return "" // Ҳолати, ки self аллакай `nil`
}
if let text = strongSelf.text {
return "<\(strongSelf.name)>\(text)</\(strongSelf.name)>"
} else {
return "<\(strongSelf.name)/>"
}
}
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
deinit {
print("\(name) дар ҳолати деактиватсия")
}
}
Интихоб байни weak ва unowned вобаста ба семантикаи муносибатҳои байни объектҳо:
weak: вақте референс метавонад дар давоми ҳаёти объект, ки ба он ишора мекунад,nilшавад.unowned: вақте объект, ки ба он ишора мешавад, кафолат дода мешавад, ки дарозтар ё баробар дарозӣ бо объекте, ки ба он ишора мекунад, вуҷуд дорад, ва референс ҳеҷگاهnilнамешавад.