Intern
Кайдаган чогултуучу (garbage collector) эмне?
sobes.tech AI
AIден жооп
iOS-та салттуу кутулушуучу чогултуучу жок. Анын ордуна Automatic Reference Counting (ARC) механизми колдонулат.
- Автоматтык механизм: ARC автоматтык түрдө объекттерге карата катуу шилтемелерди эсептейт.
- Эстеликти бошотуу: Объекттин катуу шилтемелеринин саны нөлгө жеткенде, ARC бөлүнгөн эстеликти бошотот.
- Өзгөчө учурларды алдын алуу: Катуу, алсыз жана унутулгус шилтемелерди туура колдонуу эстеликтин агып кетишин жана катуу шилтемелер циклин алдын алууга мүмкүндүк берет.
ARCтеги шилтемелердин түрлөрү:
- Катуу (strong): Шилтемелердин санын көбөйтөт. Бөлүмдө — алдын ала орнотулган.
- Алсыз (weak): Шилтемелердин санын көбөйтпөйт. Объекттин деалокациясы учурунда автоматтык түрдө
nilболот. Катуу шилтемелер циклин алдын алуу үчүн колдонулат. Опционалдуу түрдө белгиленет. - Унутулгус (unowned): Шилтемелердин санын көбөйтпөйт. Объекттин бар экендигине кепилдик берилет, ал унутулгус шилтеменин өмүр бою сакталат. Опционалдуу эмес. Эки объекттин өз ара катуу байланышы болсо, бирок алардын бири кыска өмүрлүү болсо колдонулат.
ARCтин артыкчылыктары:
- Болжолдуу: Эстелик бошотуу аныкталган, объект колдонулбай калганда гана болот.
- Иштөө натыйжалуулугу: Артка чогултуучу жүктөр жок, ал паузаларга себеп болушу мүмкүн.
- Жөнөкөйлүк: Көп учурларда, иштеп чыгуучу эстеликти кол менен башкарууга муктаж эмес, бирок шилтемелердин эсептөө принциптерин түшүнүү керек, агып кетүүнү алдын алуу үчүн.
Катуу шилтемелер циклинин мисалы:
class Person {
let name: String
var apartment: Apartment? // катуу шилтеме — Apartmentке
init(name: String) { self.name = name }
deinit { print("\(name) жоюлду") }
}
class Apartment {
let unit: String
weak var tenant: Person? // алсыз шилтеме — Personга, цикли алдын алуу үчүн
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) жоюлду") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // weak колдонуу өтө маанилүү
john = nil
unit4A = nil
// Weak tenant менен: эки объект да жоюлат.
// Weak tenant менен: эки объект да туура жоюлат.