Middle
Жоболоруңузда эс тутумдун агып кетишин кантип алдын аласыз?
sobes.tech AI
AIден жооп
Мен бир нече ыкмаларды колдонуп жатам:
- ARC (Automatic Reference Counting): Бул Swift жана Objective-Cдеги негизги эс тутумду башкаруу механизми. Ал автоматтык түрдө объекттердин шилтемелерин эсептейт жана шилтемелер саны нөлгө жеткенде бошотуп салат.
- Күчтүү шилтемелер циклин алдын алуу: Бул эң кеңири тараган эс тутум чыгуу себеби. Мен
weakжеunownedшилтемелерди колдонуп циклдерди үзөм. Бул көбүнчө делегаттар жана жабык циклдер менен иштөөдө кездешет. - Профилирлөө инструменттери: Мен Xcodeдеги инструменттерди, мисалы Instruments (Allocator, Leaks), колдонуп, чыгуу жерлерин аныктайм.
- Жабык циклдерди текшерүү: Мен жабык циклдерди, өзгөчө selfти камтыган учурда,
[weak self]же[unowned self]колдонуп, кылдат текшерем. - Хабарламалардан чыгуу: Мен
NotificationCenterжана KVO көзөмөлчүлөрүн объекттер жоголгондо чыгарам. - Көзөмөлчүлөрдү жана таймерлерди өчүрүү: Мен аларды ажыратып,
invalidateкылып, керек болбой калганда өчүрөм. - Ресурстар менен иштөө: Мен файлдар, сокеттер жана маалымат базалары сыяктуу ресурстарды туура башкаруу, убагында жабуу жана бошотуу.
- Кодду кароо: Мен кодду дайыма кароо жүргүзүп, эс тутумду башкаруу маселелерин аныктоого аракет кылам.
Мисал катары [weak self] колдонуу:
class DataFetcher {
var completionHandler: (() -> Void)?
func fetchData() {
// `weak self` колдонуу күчтүү циклдерди алдын алуу үчүн
DispatchQueue.global().async { [weak self] in
// Маалымат алуу имитациясы
sleep(1)
DispatchQueue.main.async {
// `self` нөл эмес экенин текшерүү
self?.completionHandler?()
}
}
}
}
class ViewController {
var fetcher: DataFetcher?
func setupFetcher() {
fetcher = DataFetcher()
fetcher?.completionHandler = {
// Мында `self` азыр алсыз болушу мүмкүн, эгер fetcher дагы бар болсо
print("Data fetched in ViewController")
}
}
deinit {
print("ViewController жоголду")
}
}
Мисал катары [weak] колдонуу делегат үчүн:
protocol DataProcessorDelegate: AnyObject { // AnyObject шилтемелүү типти камсыз кылат жана күчтүү циклдерди алдын алат
func processData(_ data: String)
}
class DataProcessor {
weak var delegate: DataProcessorDelegate? // `weak` колдонуу делегат үчүн
func process(_ data: String) {
delegate?.processData(data)
}
}
class AnotherViewController: DataProcessorDelegate {
let processor = DataProcessor()
init() {
processor.delegate = self
}
func processData(_ data: String) {
print("Деректерди иштетүү: \(data)")
}
deinit {
print("AnotherViewController жоголду")
}
}