ProgramlamaiOS geliştirici

Swift'teki lazy özelliklerinin ana farkları nelerdir? Lazy'yi ne zaman kullanmalısınız, başlatırken hangi özellikler ve tuzaklar vardır ve tipik sorunları nasıl önleyebilirsiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

lazy özellikler, Swift'te yalnızca onlara ilk erişim sırasında hesaplanır. Bu genellikle hemen ihtiyaç duyulmayan, kaynak açısından pahalı nesneler (örneğin, yoğun hesaplamalar, ağ yüklemeleri) için kullanılır. lazy anahtar kelimesi ile tanımlanır:

class DataFetcher { lazy var data: Data = self.loadData() func loadData() -> Data { /* … */ } }

Özellikler ve incelikler:

  • lazy özellikler yalnızca değişkenler (var) için geçerlidir, sabitler (let) için değil.
  • Yapılar içinde lazy özellikler, yapı kendisi değiştirilmezse çalışmaz.
  • Başka bir thread aracılığıyla set edildiğinde — thread güvenli değildir. Farklı thread'lerden lazy özelliklere eşzamanlı erişimden kaçınılmalıdır.
  • Sınıf nesnesinin kopyalanmasında, lazy değeri her örnek için ayrı ayrı önbelleğe alınır.

Kandırıcı bir soru.

Soru: "Lazy property'nin değeri sınıf örneği başlatıldığında mı oluşturulur?"

Cevap: Hayır, değer yalnızca özelliklere ilk erişimde hesaplanır, başlatmada değil.

class Expensive { init() { print("init") } } class Example { lazy var heavy = Expensive() } let foo = Example() // hiçbir şey yazdırmaz _ = foo.heavy // şimdi "init"

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


Hikaye

İki platformda bir projede, görüntülerin önbelleğini depolamak için lazy dizi (lazy var) kullanıldı. Birden fazla thread'den eşzamanlı erişim sırasında yarış koşulları ortaya çıktı, lazy var mutex'lerle sarıldı — ancak lazy'i unuttular, bu da uygulamanın çökmesine neden oldu.


Hikaye

Genç bir geliştirici, pahalı bir hesaplamayı önbelleğe almak için lazy let tanımlamaya çalıştı. Kod derlenmedi çünkü lazy yalnızca var için geçerliydi: mimariyi yeniden gözden geçirmek zorunda kaldı.


Hikaye

Geliştirici, başlatma sırasında closure içinde self'i yakalayarak lazy property tanımladı. Bu, döngüsel bir referansa yol açtı — nesne, tüm ekranlardan çıkmasına rağmen deinitialize edilmedi.