Sobes.tech
Middle

Escape ve non-escape kapanışları arasındaki farkı açıklayın ve hangi durumlarda @escaping kullanmanız gerektiğini belirtin.

sobes.tech yapay zeka

AI'dan gelen yanıt

Varsayılan kapanışlar kaçış olmayan olarak kabul edilir.

Kaçış olmayan kapanış:

  • 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 kapanış:

  • 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() // Daha sonra ç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 bir işleve (örneğin, ağ isteği, GCD, OperationQueue) geçirilmişse.
  • Kapanış bir olay işleyicisi veya delegat olarak kullanılıyorsa.