Middle
Чӣ гуна дар лоиҳаҳои худ аз рехтани хотираҳо пешгирӣ мекунед?
sobes.tech AI
Ҷавоб аз AI
Ман истифода мебарам чанд роҳ:
- ARC (Automatic Reference Counting): Ин механизм асосии идоракунии хотира дар Swift ва Objective-C мебошад. Он ба таври автоматӣ шумораи истинодҳоро ба объектҳо ҳисоб мекунад ва онҳоро вақте ки шумораи истинодҳо ба сифр мерасад, озод мекунад.
- Пешгирии циклҳои бо истинодҳои қавӣ: Ин сабаби маъмултарини ҷорӣ шудани хотира мебошад. Ман истифода мебарам
weakёunownedбарои қатъ кардани циклҳо. Бештар дар кор бо делегатҳо ва closureҳо рӯй медиҳад. - Асбобҳои профилинг: Ман мунтазам аз асбобҳои Xcode, мисли Instruments (Allocator, Leaks), барои ёфтани ҷойҳои ҷорӣ шудани хотира истифода мекунам.
- Таҳқиқи closureҳо: Ман closureҳоро бодиққат тафтиш мекунам, махсусан вақте ки self дар онҳо захват мешавад, бо истифода аз рӯйхатҳои захват
[weak self]ё[unowned self]. - Азхудкунии хабарномаҳо: Ман азхудкунии хабарномаҳо аз
NotificationCenterва observer-ҳо KVO дар вақти нобудшавии объектҳоро мекунам. - Насб кардани observerҳо ва таймерҳо: Ман таймерҳоро отключ мекунам ва нулӣ мекунам, вақте ки онҳо дигар лозим нестанд, ва observer-ҳоро хориҷ мекунам.
- Идоракунии захираҳо: Ман захираҳоро, мисли файлҳо, сокетҳо ва базаҳои додаҳоро дуруст идора мекунам, онҳоро дар вақти мувофиқ мебандем ва озод мекунам.
- Баррасии код: Ман мунтазам кодро баррасӣ мекунам, аз ҷумла барои ёфтани мушкилоти эҳтимолӣ дар идоракунии хотира.
Масалан, истифодаи [weak self] дар closure:
class DataFetcher {
var completionHandler: (() -> Void)?
func fetchData() {
// Истифодаи weak self барои пешгирии цикл қавӣ
DispatchQueue.global().async { [weak self] in
// Имитация гирифтани маълумот
sleep(1)
DispatchQueue.main.async {
// Санҷиш барои nil пеш аз истифодаи self
self?.completionHandler?()
}
}
}
}
class ViewController {
var fetcher: DataFetcher?
func setupFetcher() {
fetcher = DataFetcher()
fetcher?.completionHandler = {
// Ин ҷо self ҳоло метавонад суст бошад, агар fetcher ҳанӯз мавҷуд бошад
print("Data fetched in ViewController")
}
}
deinit {
print("ViewController deinitialized")
}
}
Масалан, истифодаи 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("Processing data: \(data)")
}
deinit {
print("AnotherViewController deinitialized")
}
}