Junior
Кайра иштетүүчү кандай иштейт?
sobes.tech AI
AIден жооп
iOS/macOS өнүктүрүү контекстинде Swift/Objective-C колдонуу мусор чогултуучу (GC) эмес, автоматтык шилтемелер эсептөө (Automatic Reference Counting, ARC) колдонулат.
ARC автоматтык түрдө эс тутумду башкаруу үчүн ар бир класс мисалына (жана жабыктыкка) күчтүү шилтемелердин санын эсептейт. Эгер күчтүү шилтемелердин саны нөлгө барабар болсо, системасы объекттин ээлеген эс тутумун бошотот:
ARCтин негизги учурлары:
- Күчтүү шилтемелер (Strong): шилтемелердин санын көбөйтөт. Объект эс тутумда калат, эгер ага кеминде бир күчтүү шилтеме болсо:
- Слаб шилтемелер (Weak): шилтемелердин санын көбөйтпөйт. күчтүү шилтемелер циклин алдын алуу үчүн колдонулат. Алар опционалдуу болуп, объект бошотулганда nil болот:
- Бошотулбаган шилтемелер (Unowned): шилтемелердин санын көбөйтпөйт. Объекттин жашоо цикли белгилүү болсо жана бир объект дайыма экинчисинин жашоосунда болот деп эсептелсе колдонулат. Шилтеме опционал эмес. Эгер шилтемелүү объект бошотулса, аракет кылуу катага алып келет:
ARC компиляция учурунда retain (шилтемелердин санын көбөйтүү) жана release (азайтуу) чакырууларын автоматтык түрдө кошот:
class MyClass {
var prop: String = ""
}
var reference1: MyClass? = MyClass() // Сан = 1
var reference2 = reference1 // Сан = 2
reference1 = nil // Сан = 1
reference2 = nil // Сан = 0, объект бошотулат
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
unowned var tenant: Person // Бошотулбаган шилтеме
init(unit: String, tenant: Person) { self.unit = unit; self.tenant = tenant; print("Apartment \(unit) ишке киргизилип жатат") }
deinit { print("Apartment \(unit) жоюлуп жатат") }
}