23.10.2024
0
Like
22
Views
iOS uygulamaları geliştirirken bellek yönetimi, uygulamanızın performansını optimize etmek ve çökme sorunlarını önlemek için önemli bir konudur. Bu yazıda, iOS’ta bellek yönetimini derinlemesine ele alacağız.
Memory Management Nedir ?
Bellek yönetimi, bir uygulamanın belleği verimli bir şekilde tahsis etmesi ve serbest bırakması işlemidir. Doğru memory management kullanımı uygulamanın performansını, bellekteki verilerin doğru yönetilmesini, kaynakların verimli kullanılmasını sağlar.
iOS’ta iki farklı bellek yönetim modeli vardır : MRC ve ARC.
Automatic Reference Counting (ARC)
Swift, uygulamanızın bellek kullanımını izlemek ve yönetmek için ARC kullanır. ARC, nesnelerin referanslarını otomatik olarak takip eder ve artık kullanılmadığında belleği serbest bırakır.
ARC’nin nasıl çalıştığını inceleyelim:
class Product {
let name: String
init(name: String) {
self.name = name
print("\(name) ürün bellekte oluşturuldu")
}
deinit {
print("\(name) ürün bellekte temizlendi")
}
}
var product1: Product? = Product(name: "Telephone") //reference counter = 1
var product2: Product? = product1 //reference counter = 2
product1 = nil //reference counter = 1
product2 = nil //reference counter = 0
Yukarıda ki kod bloğunun çıktısı:
Telephone ürün bellekte oluşturuldu
Telephone ürün bellekte temizlendi
Referans Türleri
nil
olur. Bu, retain cycle’ ları önlemek için idealdir.Retain Cycles
ARC görevini yerine getirirken bazı durumlarda retain cycle oluşur. Retain cycle, iki veya daha fazla nesnenin birbirine güçlü (strong) referansla bağlı kalması durumunda oluşur ve bu nesneler bellekten temizlenemez. Bu durum bellek sızıntılarına (memory leak) yol açar.
class Product {
let name: String
var seller: Seller?
init(name: String) {
self.name = name
print("\(name) ürün bellekte oluşturuldu")
}
deinit {
print("\(name) ürün bellekte temizlendi")
}
}
class Seller {
let name: String
var product: Product?
init(name: String) {
self.name = name
print("\(name) satıcı bellekte oluşturuldu")
}
deinit {
print("\(name) satıcı bellekte temizlendi")
}
}
var product: Product? = Product(name: "Camera")
var seller: Seller? = Seller(name: "Emily")
product?.seller = seller
seller?.product = product //Burada retain cycle oluşur.
product = nil
seller = nil
Yukarıda ki kod bloğunun çıktısı:
Camera ürün bellekte oluşturuldu
Emily satıcı bellekte oluşturuldu.
Yukarıda ki kod örneğine bakalım:
Peki bunun çözüm yolu nedir?
Retain cycle’ ı önlemek için yapılabilecek bazı şeyler şunlardır:
Yukarıda ki kod örneğinde ki retain cycle’ ı çözmek için strong referans oluşturan nesnelerden birini weak yapmamız yeterli olacaktır. Bu retain cycle önlemek için Product sınıfında ki seller özelliğini weak olarak tanımlayabiliriz.
Unowned tanımlasak da aynı sonucu alabilirdik. Ancak dikkatli olmak lazım çünkü unowned referanslar, referans verdikleri nesnenin yok olup olmadığını kontrol etmez. Eğer unowned bir referansa erişildiğinde referans verilen nesne artık mevcut değilse, uygulama çöker. Eğer Product her zaman bir Seller’ a sahip olacaksa ve bu ilişki boyunca Seller’ ın yaşam döngüsü Product’ dan bağımsız olarak garanti ediliyorsa, unowned referansı kullanmak mantıklı olabilir.
class Product {
let name: String
weak var seller: Seller?
init(name: String) {
self.name = name
print("\(name) ürün bellekte oluşturuldu")
}
deinit {
print("\(name) ürün bellekte temizlendi")
}
}
class Seller {
let name: String
var product: Product?
init(name: String) {
self.name = name
print("\(name) satıcı bellekte oluşturuldu")
}
deinit {
print("\(name) satıcı bellekte temizlendi")
}
}
var product: Product? = Product(name: "Camera")
var seller: Seller? = Seller(name: "Emily")
product?.seller = seller
seller?.product = product //Biri weak olduğu için retain cycle oluşmaz.
product = nil
seller = nil
Yukarıda ki kod bloğunun çıktısı:
Camera ürün bellekte oluşturuldu
Emily satıcı bellekte oluşturuldu.
Emily satıcı bellekte temizlendi.
Camera ürün bellekte temizlendi.
Şimdi gelelim retain cycle’ ın en yaygın sonuçlarından biri olan bellek sızıntısına..
Memory Leak (Bellek Sızıntısı)
Memory leak, artık kullanılmayan bir nesnenin referans sayısının sıfıra düşmemesi ve bu nedenle bellekten serbest bırakılmaması durumudur. Memory leak oluşumu sistemin belleğini tüketir ve uygulamanın performansını düşürüp çökmesine bile sebep olabilir.
Xcode, memory leak’ leri tespit etmek için birkaç araca sahiptir. Bunlardan en çok tercih edilenlerden biri : Instruments
Instruments
Xcode’un Instruments aracındaki Leaks aracı, bellek sızıntılarını tespit etmek için özel olarak tasarlanmıştır.
Instruments ile Memory Leak Bulma Adımları:
You need to log in to be able to comment!
Şehriban Yıldırım
Yazılım Mühendisliği mezunuyum, Swift ile mobil uygulama geliştiriyorum ve bu alanda kendimi geliştirmeye devam ediyorum. https://medium.com/@sehribanyildirim051
Location
İstanbul, TR
Education
Yazılım Mühendisliği - Fırat Üniversitesi
Job Experience
Intern - Bera Ar-Ge Yazılım
Intern - Mobillium