Middle
Loyihalaringizda xotira oqib ketishini qanday oldini olasiz?
sobes.tech AI
AIdan javob
Men bir nechta yondashuvlardan foydalanaman:
- ARC (Avtomatik Referenslar Hisobi): Bu Swift va Objective-C da asosiy xotira boshqarish mexanizmi. U ob'ektlarga bo'lgan referenslarni avtomatik ravishda hisoblaydi va referenslar soni nolga teng bo'lsa, ularni bo'shatadi.
- Kuchli referens aylanishlaridan qochish: Bu eng keng tarqalgan xotira oqibati sababidir. Men
weakyokiunownedreferenslardan foydalanaman, aylanishlarni buzish uchun. Bu odatda delegatlar va yopilishlar bilan ishlashda yuzaga keladi. - Profiling vositalari: Men Xcode ning Instruments (Allocator, Leaks) kabi vositalaridan muntazam foydalanaman, oqibalarni aniqlash uchun.
- Yopilishlarni tekshirish: Men yopilishlarni ehtiyotkorlik bilan tekshiraman, ayniqsa
selfni ushlab qolishda,[weak self]yoki[unowned self]yozuvlaridan foydalanib. - Bildirishnomalardan chiqish: Men
NotificationCenterva KVO kuzatuvchilaridan ob'ektlar yo'q qilinayotganda chiqaman. - Kuzatuvchilar va vaqtinchalik taymerlarni olib tashlash: Men invalid bo'lgan taymerlarni o'chiraman va ularni nullga o'rnataman, shuningdek, kerak bo'lmagan kuzatuvchilarni olib tashlayman.
- Resurslarni boshqarish: Men fayllar, soketlar va ma'lumotlar bazalari kabi resurslarni to'g'ri boshqaraman, ularni vaqtida yopib va bo'shataman.
- Kodlarni ko'rib chiqish: Men muntazam ravishda kodlarni ko'rib chiqaman, jumladan, xotira boshqarish bilan bog'liq muammolarni aniqlash uchun.
[weak self] dan foydalanish misoli:
class DataFetcher {
var completionHandler: (() -> Void)?
func fetchData() {
// Kuchli aylanishni oldini olish uchun weak self dan foydalanish
DispatchQueue.global().async { [weak self] in
// Ma'lumotlarni olishni simulyatsiya qilish
sleep(1)
DispatchQueue.main.async {
// self ni nil emasligini tekshirish
self?.completionHandler?()
}
}
}
}
class ViewController {
var fetcher: DataFetcher?
func setupFetcher() {
fetcher = DataFetcher()
fetcher?.completionHandler = {
// Bu yerda, agar fetcher hali mavjud bo'lsa, self endi zaif bo'lishi mumkin
print("Ma'lumotlar ViewController da olindi")
}
}
deinit {
print("ViewController yo'q qilindi")
}
}
weak dan foydalanish delegat uchun misol:
protocol DataProcessorDelegate: AnyObject { // AnyObject referens turini ta'minlaydi va kuchli aylanishlarni oldini oladi
func processData(_ data: String)
}
class DataProcessor {
weak var delegate: DataProcessorDelegate? // weak dan foydalanish
func process(_ data: String) {
delegate?.processData(data)
}
}
class AnotherViewController: DataProcessorDelegate {
let processor = DataProcessor()
init() {
processor.delegate = self
}
func processData(_ data: String) {
print("Ma'lumotlarni ishlash: \(data)")
}
deinit {
print("AnotherViewController yo'q qilindi")
}
}