Top-Fehler von Swift-Anfängern: Fortgeschrittenes Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Top-Fehler von Swift-Anfängern: Fortgeschrittenes Niveau



Wenn Sie von der Erstellung einfacher Bildschirme in SwiftUI zur Entwicklung komplexer, multithreaded Anwendungen mit benutzerdefinierter Architektur übergehen, steigt die Anzahl der Fallstricke drastisch an. Viele Entwickler, die die grundlegende Swift-Syntax beherrschen, halten sich für bereit für die Produktion, machen jedoch kritische Fehler, die zu Speicherlecks, instabilem Verhalten und schwer zu findenden Bugs führen. In diesem Artikel analysieren wir vier Fehlerkategorien, die am häufigsten bei Entwicklern mittleren Niveaus auftreten.



1. Speicherlecks in Closures: Nicht nur [weak self]



Der häufigste Fehler ist die Verwendung von [weak self], ohne zu verstehen, wann dies wirklich notwendig ist. Viele Entwickler setzen weak self überall dort ein, wo eine Closure vorhanden ist, was zu einer vorzeitigen Zerstörung von Objekten führt. Oder sie vergessen starke Referenzzyklen an unerwarteten Stellen.



Typischer Fehler: Erstellen einer starken Referenz auf ein Objekt innerhalb einer Closure, die dieses Objekt speichert.



class NetworkManager {    var onCompletion: (() -> Void)?        func fetchData() {        // FEHLER: Die Closure erfasst self stark        onCompletion = {            self.updateUI()        }    }        func updateUI() {        print("UI aktualisiert")    }}


Richtige Lösung: Verwenden Sie [weak self] oder [unowned self] in Abhängigkeit von der Lebensdauer der Objekte.



class NetworkManager {    var onCompletion: (() -> Void)?        func fetchData() {        onCompletion = { [weak self] in            guard let self = self else { return }            self.updateUI()        }    }        func updateUI() {        print("UI aktualisiert")    }}


Fortgeschrittener Nuance: Seien Sie vorsichtig mit [unowned self]. Wenn das Objekt freigegeben wird und die Closure aufgerufen wird, stürzt die Anwendung ab. Verwenden Sie unowned nur, wenn Sie zu 100% sicher sind, dass das Objekt die Closure überlebt.



2. Falsche Arbeit mit async/await und Akteuren



Mit dem Aufkommen von Structured Concurrency in Swift 5.5 haben viele Entwickler begonnen, async/await aktiv zu nutzen, vergessen jedoch MainActor und Sendable. Dies führt zu Race Conditions und UI-Updates aus dem Hintergrundthread.



Typischer Fehler: Aufruf einer asynchronen Funktion, die auf dem Hauptthread ausgeführt werden sollte, ohne explizite Angabe von @MainActor.



class ViewModel: ObservableObject {    @Published var data: [String] = []        // FEHLER: Die Funktion ist nicht mit @MainActor markiert    func loadData() async {        let result = await fetchFromNetwork()        // Dies könnte im Hintergrundthread ausgeführt werden!        self.data = result    }        func fetchFromNetwork() async -> [String] {        try? await Task.sleep(nanoseconds: 1_000_000_000)        return ["Item1", "Item2"]    }}


Richtige Lösung: Verwenden Sie @MainActor für Funktionen, die die UI aktualisieren.



class ViewModel: ObservableObject {    @Published var data: [String] = []        @MainActor // Jetzt garantiert auf dem Hauptthread ausgeführt    func loadData() async {        let result = await fetchFromNetwork()        self.data = result    }        func fetchFromNetwork() async -> [String] {        try? await Task.sleep(nanoseconds: 1_000_000_000)        return ["Item1", "Item2"]    }}


Fortgeschrittener Nuance: Vergessen Sie nicht nonisolated und actor. Wenn Sie Akteure verwenden, sind alle öffentlichen Methoden standardmäßig asynchron. Dies kann zu unerwarteten Verzögerungen führen, wenn Sie die Isolation nicht durchdacht haben.



3. Race Conditions in

Blogs

Buchempfehlungen