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
@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() // 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.