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
@escapingifadesi 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.