İyi hafıza yönetimi yüksek performanslı iOS uygulamaları sunmak için kritik bir faktördür. Verimli hafıza kullanımı doğrudan uygulama yanıtlayıcılığı, batarya yaşamı ve genel kullanıcı memnuniyeti sağlar. Apple'ın otomatik referansı (ARC) en iyi uygulamaları, gelişmiş teknikleri ve yaygın pitfalls'ları önlemek için en iyi şekilde benimsemeli.

iOS Memory Management

iOS, otomatik referans sayılarını sıfıra indirdiğinde otomatik referans Says:0) ve 'i derleyici olarak kullanarak, referans sayılarını sıfıra indirmez. Ancak, ARC referans notu tüm hafıza sorunlarını engellemez - referans türleri, veri yapıları ve kaynak döngüsü önemli kalır.

ARC Nasıl Çalışır

Her bir referans türü ( sınıfı) bir yedeke referans verdiğinizde, ARC, kapsamın dışına çıktığında veya [[Şerefli döngüler:2) ARC decrements sayın.Bu nesne sıfıra ulaştığında, bu determinist anlaşma konumlama sistemleri üzerinde önemli bir avantajdır, ancak kapsamın dışına çıkarılır.

Güçlü, Weak ve ait olmayan Referanslar

ARC üç referans türü destekler:

  • [FONT=0)Strong[[Dönetici: 1))) (default): Karşılaşma sayılarını en az bir güçlü referans var olarak hayatta kalır.
  • [FONT=0)Weak[DÜDÜT:1): Uygulamanın kapsamını artırmıyor. Referans otomatik olarak ayarlandığında, nesnenin bölündüğünde. döngüleri korumak için zayıf referanslar kullanın (örneğin, delege özellikleri).
  • [FONT:0)[Dönetici: Zayıflığa benzer, ancak referanslı nesnenin referans süresi boyunca asla arsaya girmeyeceğini varsayar.[0]Bir uyarıda yer alan referansın kullanılması, bir süre kazasından sonra referansın kullanılmasını gerektirir.

Bu ayrımları anlamak hafıza sızıntılarını ve kazalarını önlemek için gereklidir. Örneğin, yakalaması: GÜNCELT:7, aynı zamanda İLFLT:8 tarafından da tutulmaktadır.

En İyi Uygulamalar için Optimizing Memory Use

Bu uygulamaları sürekli olarak hafıza basıncı azaltır, performans geliştirir ve iOS hafıza saatidog tarafından sonlandırma riskini azaltır.

Düzenli olarak Instruments ile

Xcode Instruments hafıza analizi için en güçlü araçtır. Anahtar aletler şunları içerir:

  • [FONT:0)Allocations[[Dönetici: Tracks object creation and deallocation. eylemlerin hafıza kullanımını karşılaştırmak için “Mark Generation” özelliğini kullanın.
  • [FONT:0)Leaks[[Dönetici: 1): Otomatik olarak sızıntı nesneleri tespit eder. Bu cihazı sıklıkla geliştirme sırasında çalıştırın.
  • [FONT:0) VM Tracker): Kirli sayfalar dahil olmak üzere sanal hafızayı izleyin, bu büyük veriler için kullanımdan daha bilgilendirici olabilir.

Geliştirme iş akışınızın bir parçası haline getirin - özellikle de serbest bırakılmadan önce.TheurFLT:0) Apple Instruments Belgeleri) sonuçları yorumlamak için ayrıntılı bir kılavuz sunar.

Memory Uyarılarına Yanıt Ver

iOS, sistem hafızada düşük olduğunda birFLİLM gönderir. Cevap vermek için başarısız olabilir bir kazaya yol açabilir. ImplementİLFLT:10).

  • Önbellek nesneleri (örneğin, 08.03.2012) veya özel sözlükler)
  • Diskten yeniden yüklenebilir Büyük görüntüler
  • Reusable view modelleri veya non-kritik olmayan veriler

Örnek uygulama:

override func didReceiveMemoryWarning() {
 super.didReceiveMemoryWarning()
 imageCache.removeAllObjects()
 thumbnailCache.removeAllObjects()
 // Clear any other disposable resources
}

Ayrıca, görüntü kapalı olduğunda gerekli olmayan ücretsiz kaynaklara dikkat edin.

Retain Döngüsünden Kaçınmak

Retain döngüleri iOS uygulamaları için en yaygın bellek sızıntısıdır. Tipik senaryolar şunları içerir:

  • [FONT:0)Delegasyon[DÜDÜT:1): Declare delege özellikleri = 5,9.
  • [FONT=0)[[[FONT]: Bir kapanışlar (Dönetici: 9) ve [[Dönetici:)) bir yakalama listesi: [[QUŞAYGÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ
  • [FONT:0]Nested kapanışlar[[Dönetici: Başvuru yakalama listeleri, kendi referansını yakalayan her bir kapanışda sürekli olarak listeler.

Güvenli bir kapatma örneği:

networkManager.fetchData { [weak self] result in
 guard let self = self else { return }
 self.updateUI(with: result)
}

*) Yalnızca o zaman, sonlardan önce kapanmayacaksınız (örneğin kısa ömürlü animasyonlar).

Optimizing Data Yükleniyor

Bu teknikleri işe almak için gereksiz veriler bellek atıklarına yükleyin.

  • [FONT:0]Lazy anlıkiation[[[Döntgen: 1 ): Gerekli olana kadar pahalı nesnelerin gecikmesi.
  • [FONT:0)Batch[[Dön verilerle, kullanım kolaylığı ile] tüm nesneleri bir anda hafızaya yüklemekten kaçınmak için sınırlar ve toplu boyutlardaki boşluklar.
  • [FONT:0]: Önbellekler için [[GÖRT:0] [FONT:0] [FONT: 3 ))[FONT: UseENFLT:25).
  • [FONT:0]Downsample görüntüler[[DFLT:1): Gözcükler gösterdiğinizde, hafızadaki tam çözünürlüklü görüntülerden kaçınmak için ölçeklenmiş versiyonlar oluşturun.

Ağ yanıtları için, JSON artışını ([[DÜŞÜNÜŞÜNÜŞÜNÜŞÜN) veya büyük maaş yükleri ile ⁇ s kullanmak.

View Controllers'ta Yeniden kiralama Kaynakları

Kontrolcüleri genellikle çok sayıda kaynağa sahiptir: gözlemciler, zamanlayıcılar, jimler ve büyük veri yapıları.Her zaman urpert inancaFLT:30) veya uygun yaşam döngüsü yöntemleri:

  • Gözlemci kayıtları ([[DÜDÜDÜŞÜN, KVO)
  • Invalidate timers and display Links
  • Ekrandan çıkarken Cancel network operations when leave a screen
  • Ayrıntılı ağır nesnelere ayarlandığında, [[DüzDÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜNÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜNÜŞÜŞÜŞÜNÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜŞÜ

Gelişmiş Memory Management Techniques

Limitleri iten uygulamalar için - büyük veri setleri, gerçek zamanlı teslimat veya arka plan işleme gibi - daha derin teknikler gereklidir.

Auto release Pools kullanarak

Autocast havuzları otomatik olarak bir run döngüsü sonunda kaybolur, ancak ağır döngüler sırasında birçok objeyi bir araya getirebilirler (örneğin, büyük diziler işleme).Çekli bir otomatik sürüm havuzunda nesneleri serbest bırakmak için yuvarlak vücut:

for i in 0..<100000 {
 autoreleasepool {
 let heavyObject = createHeavyObject(i)
 // use heavyObject
 }
}

Bu, yüksek bellek kullanımını dramatik bir şekilde azaltır.TheurFLT:0) Apple otomatik sürüm havuzlarında belgelendirme) ayrıntılı olarak açıklıyor.

Değer türleri vs. Referans Türü

Swift structs (değer tipler) sabit tutulur ve yığın tahsislerini azaltabilir. Basit değer semantics olan model nesneler için kazınabilir. ancak büyük structların akış veya kopyalama maliyetlerine neden olabileceğini bilin. UseEND:35

Memory Mapping Large Files

Büyük veri dosyaları için (videolar, veritabanı), API'leri ile yükleme işlemi için API'leri kullanın.YouTube'da yer değiştirmeden veri yüklemek için.)YouTube'da bulunan ve Swift'de bulunan dosya sayısı 3,00 $ 'a kadar otomatik olarak oluşturulabilir.

if let data = try? Data(contentsOf: fileURL, options: .mappedIfSafe) {
 // use data — pages are loaded on demand
}

Bellek haritalaması, yalnızca sözlükler veya prekomputed varlıklar gibi verileri okumak için özellikle etkilidir.

Arka Görev ve Hafıza Kıtları

Arka görevleri yerine getirmek (örneğin, 03.Örnek) ile hafıza sınırlı olduğunda, hafıza süresine son verilmesi için hafıza kullanımını azaltır.UseENFLT:43). düşük hafıza durumlarını işlemek veya üst düzey operasyonları üst alana yatırmak için.

Common Memory Issues and Solutions

Dikkatli planlama ile bile, hafıza sorunları yüzey olabilir. İşte tipik sorunlar ve tedavileri.

Zombi Objects ve Dangling Pointers

Over-released objects neden kazalara sebep oluyor dördüşükümeler. Xcode'un program ayarlarında bunu geliştirme sırasında tespit etmek için Zombi Objects tanısını mümkün kılar. kök nedeni, özellikle de erken serbest bırakılan veya düzgün bir şekilde ayarlanmamış olan delegeler arasında yanlış bir uyumdur.

Memory Leaks with Instrumentss

Leaks cihazını tipik kullanıcı akışlarını yaparken çalıştırın. Özel dikkat edin:

  • Kontrollü geçişler (push/pop)
  • Modal sunum
  • Yakalanan referanslarla ilgili Klozlar
  • Üçüncü taraf kütüphaneleri

Bir sızıntı görünürse, Debug Memory Graph aracında referans grafiğini inceler (Xcode'un hafıza grafiği debugger). Bu görsel temsil genellikle döngüleri hemen ortaya çıkarır.

Memory Spikes ve onların Kök Sebepleri

Sudden hafıza aksaklıkları genellikle kaynaklanır:

  • [FONT:0)Large görüntü yükleme: Ekran için gerekli olan boyuta her zaman aşağı ölçekli görüntüler.Useurs için|46]
  • [FONT=0)JSON parsing[Dönetici: Cenks'te JSON'u yok etmek veya büyük cevaplar için akış ⁇ s kullanmak.
  • [FONT:0) Kıyık olmayan veriler[Dönetici: Sınırlı sınırlar belirlemek ve proaktif olarak purge önbellekleri.
  • [FONT:0) Zamanlayıcıları veya CADisplayLink)): Kullanılmayanları garanti altına alın.

Allocations enstrümanı ile zirve hafızayı izleyin ve hafıza uyarı uçlarını yakalamak için ayarlayın.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

iOS uygulamalarında bellek yönetimi, otomatik ücretli havuzlar ve hafıza haritalarını disipline alan kodlama uygulamaları ve düzenli profilleme ile birleştirir.Temellerle başlayın - zayıf referanslar kullanarak, bellek uyarıları ve cihazı ile profillendirmek - daha sonra yüksek performanslı senaryolar ve hafıza haritaları gibi ileri teknikler kabul edin.[TFL]