From f8fb99cc418665226164597d9948d1551435f206 Mon Sep 17 00:00:00 2001 From: Tomas Harkema Date: Tue, 27 Apr 2021 16:19:35 +0200 Subject: [PATCH] burn some leaks --- .../OpenHaystack/FindMy/FindMyController.swift | 16 +++++++++------- .../HaystackApp/AccessoryController.swift | 17 +++++++++-------- .../HaystackApp/AccessoryNearbyMonitor.swift | 4 ++-- .../Views/AccessoryMapAnnotation.swift | 3 ++- .../OpenHaystack/MapViewController.swift | 4 ++-- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift b/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift index 5103442..144e0e1 100755 --- a/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift +++ b/OpenHaystack/OpenHaystack/FindMy/FindMyController.swift @@ -32,7 +32,8 @@ class FindMyController: ObservableObject { self.devices = devices // Decrypt the reports with the imported keys - DispatchQueue.global(qos: .background).async { + DispatchQueue.global(qos: .background).async { [weak self] in + guard let self = self else { return } var d = self.devices // Add the reports to the according device by finding the right key for the report @@ -57,8 +58,8 @@ class FindMyController: ObservableObject { } // Decrypt the reports - self.decryptReports { - self.exportDevices() + self.decryptReports { [weak self] in + self?.exportDevices() DispatchQueue.main.async { completion() } @@ -108,7 +109,8 @@ class FindMyController: ObservableObject { func fetchReports(with searchPartyToken: Data, completion: @escaping (Error?) -> Void) { - DispatchQueue.global(qos: .background).async { + DispatchQueue.global(qos: .background).async { [weak self] in + guard let self = self else { return } let fetchReportGroup = DispatchGroup() let fetcher = ReportsFetcher() @@ -166,10 +168,10 @@ class FindMyController: ObservableObject { } #endif - DispatchQueue.main.async { - self.devices = devices + DispatchQueue.main.async { [weak self] in + self?.devices = devices - self.decryptReports { + self?.decryptReports { completion(nil) } diff --git a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift index 9f39cd0..edccb58 100644 --- a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift +++ b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift @@ -30,12 +30,12 @@ class AccessoryController: ObservableObject { } func initAccessoryObserver() { - self.selfObserver = self.objectWillChange.sink { _ in + self.selfObserver = self.objectWillChange.sink { [weak self] _ in // objectWillChange is called before the values are actually changed, // so we dispatch the call to save() - DispatchQueue.main.async { - self.initObserver() - try? self.save() + DispatchQueue.main.async { [weak self] in + self?.initObserver() + try? self?.save() } } } @@ -45,7 +45,7 @@ class AccessoryController: ObservableObject { $0.cancel() }) self.accessories.forEach({ - let c = $0.objectWillChange.sink(receiveValue: { self.objectWillChange.send() }) + let c = $0.objectWillChange.sink(receiveValue: { [weak self] in self?.objectWillChange.send() }) // Important: You have to keep the returned value allocated, // otherwise the sink subscription gets cancelled self.listElementsObserver.append(c) @@ -160,7 +160,8 @@ class AccessoryController: ObservableObject { /// /// - Parameter completion: called when the reports have been succesfully downloaded or the request has failed func downloadLocationReports(completion: @escaping (Result) -> Void) { - AnisetteDataManager.shared.requestAnisetteData { result in + AnisetteDataManager.shared.requestAnisetteData { [weak self] result in + guard let self = self else { return } switch result { case .failure(_): completion(.failure(.activatePlugin)) @@ -173,7 +174,7 @@ class AccessoryController: ObservableObject { return } - self.findMyController.fetchReports(for: self.accessories, with: token) { result in + self.findMyController.fetchReports(for: self.accessories, with: token) { [weak self] result in switch result { case .failure(let error): os_log(.error, "Downloading reports failed %@", error.localizedDescription) @@ -183,7 +184,7 @@ class AccessoryController: ObservableObject { if reports.isEmpty { completion(.failure(.noReportsFound)) } else { - self.updateWithDecryptedReports(devices: devices) + self?.updateWithDecryptedReports(devices: devices) completion(.success(())) } } diff --git a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryNearbyMonitor.swift b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryNearbyMonitor.swift index 9f77ac6..5fb65f4 100644 --- a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryNearbyMonitor.swift +++ b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryNearbyMonitor.swift @@ -28,8 +28,8 @@ class AccessoryNearbyMonitor: BluetoothAccessoryDelegate { } func initTimer() { - self.cleanup = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in - self.removeNearbyAccessories() + self.cleanup = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in + self?.removeNearbyAccessories() } } diff --git a/OpenHaystack/OpenHaystack/HaystackApp/Views/AccessoryMapAnnotation.swift b/OpenHaystack/OpenHaystack/HaystackApp/Views/AccessoryMapAnnotation.swift index b0fb93c..1474f3f 100644 --- a/OpenHaystack/OpenHaystack/HaystackApp/Views/AccessoryMapAnnotation.swift +++ b/OpenHaystack/OpenHaystack/HaystackApp/Views/AccessoryMapAnnotation.swift @@ -45,7 +45,8 @@ class AccessoryAnnotationView: MKAnnotationView { func updateView() { guard let accessory = (self.annotation as? AccessoryAnnotation)?.accessory else { return } self.pinView?.removeFromSuperview() - self.pinView = NSHostingView(rootView: AccessoryPinView(accessory: accessory)) + self.pinView = nil + self.pinView = NSHostingView(rootView: AccessoryPinView(accessory: accessory)) // LEAK! Something swiftui? self.addSubview(pinView!) diff --git a/OpenHaystack/OpenHaystack/MapViewController.swift b/OpenHaystack/OpenHaystack/MapViewController.swift index af0afcf..451715f 100755 --- a/OpenHaystack/OpenHaystack/MapViewController.swift +++ b/OpenHaystack/OpenHaystack/MapViewController.swift @@ -52,8 +52,8 @@ final class MapViewController: NSViewController, MKMapViewDelegate { } func zoomInOn(annotations: [MKAnnotation]) { - DispatchQueue.main.async { - self.mapView.showAnnotations(annotations, animated: true) + DispatchQueue.main.async { [weak self] in + self?.mapView.showAnnotations(annotations, animated: true) } }