Дар бораи давраи ҳаёти объект дар iOS гӯед.
sobes.tech AI
Ҷавоб аз AI
Цикли ҳаёти объекти дар iOS тавассути механизмии ҳисобкунии истинодҳо (Reference Counting) идора карда мешавад. роҳи маъмултарини он Automatic Reference Counting (ARC) мебошад.
Қадамҳои ҳаёти объект:
-
Эҷод (Creation): Объект тавассути инициализатсияи синф эҷод мешавад. Ҳисобкунаки истинод ба 1 баробар мешавад.
// Инициализацияи объекти синфи MyClass let myObject = MyClass() -
Истифода (Usage): Объект дар барнома истифода мешавад. Объектҳои дигар метавонанд ба он истинод гиранд, ки ҳисобкунаки истинодро зиёд мекунад.
// Объекти дигар ба он истинод мегирад anotherObject.referenceToMyObject = myObject // Ҳисобкунаки истинод ба myObject зиёд мешавад -
Баҳракашӣ (Deallocation): Вақте ки ҳисобкунаки истинод ба сифр мерасад, runtime автоматӣ методи
deinit()(барои синфҳои Objective-C -dealloc) -ро даъват мекунад. Объект ёдгории ёдгории мемонад.deinit { // Код барои озод кардани захираҳо print("Объект нобуд шуд") }
Масъалаҳо ва ҳалли онҳо:
- Retain Cycles (цикли қавии истинодҳо): Вақте ки ду ё бештар объект қавитарин истинодҳоро ба ҳам доранд. Ҳисобкунаки истинодҳо барои ҳар як объект ҳеҷ гоҳ ба сифр намерасад, ва объектҳо нобуд намешаванд.
- Ҳалли онҳо:
- Weak References: Бо калимаи калидии
weakнишон дода мешаванд. Ҳисобкунаки истинодро зиёд намекунанд. Барои истинодҳо ба объектҳои падар ё делегатҳо истифода мешаванд, вақте ки пайвандӣ муваққатӣ ё интихобӣ аст. - Unowned References: Бо калимаи калидии
unownedнишон дода мешаванд. Ҳисобкунаки истинодро зиёд намекунанд. Вақте ки объектҳои пайваст ҳамеша ҳаёти якхела доранд, ва истинод бехатар нест, киnilбошад, истифода мешаванд. Агар объекте, ки ба он истинод мешавад, нобуд шавад, кӯшиши дастрасӣ ба он метавонад ба хато дар runtime оварда расонад.
- Weak References: Бо калимаи калидии
Масалан weak ва unowned дар closure-ҳо барои пешгирии цикли қавии истинодҳо:
class Person {
let name: String
// Истиноди суст ба closure барои пешгирии цикл
var greeting: (() -> Void)?
init(name: String) {
self.name = name
// Гирифтани self ҳамчун weak reference
greeting = { [weak self] in
guard let self = self else { return }
print("Салом, \(self.name)!")
}
}
deinit {
print("\(name) нобуд шуд")
}
}
class Apartment {
let unit: String
// Истиноди суст ба иҷорагир
weak var tenant: Person?
init(unit: String) {
self.unit = unit
}
deinit {
print("Панҷара \(unit) нобуд шуд")
}
}
Тартиби дурустии идоракунии истинодҳо барои пешгирии шишаи хотир (memory leaks) ва нигоҳ доштани устувории барнома хеле муҳим аст.