Sobes.tech
Middle

Escape və non-escape closures arasındakı fərqi izah edin və hansı hallarda @escaping istifadə etmək lazım olduğunu qeyd edin.

sobes.tech Süni İntellekt

AI-dan cavab

Varsayılan bağlamalar kaçış olmayan (non-escaping) sayılır.

Kaçış olmayan bağlamalar:

  • Kendisine geçirilen fonksiyonun gövdesinde çalıştırılır.
  • Değişkenleri yakalar, ancak fonksiyon tamamlandıktan sonra serbest bırakır.
  • Fonksiyonun ömrünü aşmaz.
func doSomething(completion: () -> Void) {
    // completion çağrısı burada
    completion() 
}

Kaçış eden bağlamalar:

  • Verilen fonksiyon geri döndükten sonra çalıştırılır.
  • Fonksiyon gövdesinden sonra devam eder.
  • Daha sonra çalıştırılmak üzere saklanabilir, örneğin başka bir iş parçacığında veya asenkron olarak.
  • Değişkenleri yakalar ve güçlü referanslar tutar, bu da güçlü referans döngülerine (retain cycles) yol açabilir. Açıkça @escaping ifadesi gereklidir.
class DataManager {
    var completionHandlers: [() -> Void] = []

    func addCompletionHandler(handler: @escaping () -> Void) {
        completionHandlers.append(handler)
    }

    func performTasks() {
        // Görevleri gerçekleştir...
        for handler in completionHandlers {
            handler() // Keyinchalik çağırılır
        }
    }
}

@escaping kullanımı aşağıdaki durumlarda gereklidir:

  • Kapanış bir sınıf veya yapı özelliğinde saklanıyorsa.
  • Kapanış başka bir iş parçacığına veya asenkron operasyona uzatılmışsa (örneğin, ağ isteği, GCD, OperationQueue).
  • Kapanış olay işleyicisi veya delegat olarak kullanılıyorsa.