From 2c0709fa38e4724c525f93c054ce8f13881eea25 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 25 Feb 2019 17:04:30 -0800 Subject: [PATCH] Fixes various memory leaks --- Delta/Game Selection/GamesViewController.swift | 6 ++++-- .../Syncing/GameSyncStatusViewController.swift | 12 ++++++------ .../Syncing/RecordVersionsViewController.swift | 4 ++-- .../Settings/Syncing/SyncStatusViewController.swift | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Delta/Game Selection/GamesViewController.swift b/Delta/Game Selection/GamesViewController.swift index 4631f42..b89a6a5 100644 --- a/Delta/Game Selection/GamesViewController.swift +++ b/Delta/Game Selection/GamesViewController.swift @@ -170,8 +170,10 @@ private extension GamesViewController self.searchController = RSTSearchController(searchResultsController: searchResultsController) self.searchController?.searchableKeyPaths = [#keyPath(Game.name)] - self.searchController?.searchHandler = { [weak searchController, weak searchResultsController] (searchValue, _) in - if searchController?.searchBar.text?.isEmpty == false + self.searchController?.searchHandler = { [weak self, weak searchResultsController] (searchValue, _) in + guard let self = self else { return nil } + + if self.searchController?.searchBar.text?.isEmpty == false { self.pageViewController.view.isHidden = true } diff --git a/Delta/Settings/Syncing/GameSyncStatusViewController.swift b/Delta/Settings/Syncing/GameSyncStatusViewController.swift index 6cffbdc..ffc5742 100644 --- a/Delta/Settings/Syncing/GameSyncStatusViewController.swift +++ b/Delta/Settings/Syncing/GameSyncStatusViewController.swift @@ -73,9 +73,9 @@ private extension GameSyncStatusViewController { private func makeDataSource() -> RSTCompositeTableViewDataSource { - func configure(_ cell: UITableViewCell, recordedObject: NSManagedObject) - { - if let record = self.recordsByObjectURI[recordedObject.objectID.uriRepresentation()], record.isConflicted + // Use closure instead of local function to allow us to capture `self` weakly. + let configure = { [weak self] (cell: UITableViewCell, recordedObject: NSManagedObject) in + if let record = self?.recordsByObjectURI[recordedObject.objectID.uriRepresentation()], record.isConflicted { cell.textLabel?.textColor = .red } @@ -96,7 +96,7 @@ private extension GameSyncStatusViewController cell.textLabel?.text = NSLocalizedString("Game Save", comment: "") } - configure(cell, recordedObject: item) + configure(cell, item) } let saveStatesFetchRequest = SaveState.fetchRequest() as NSFetchRequest @@ -109,7 +109,7 @@ private extension GameSyncStatusViewController let saveStatesDataSource = RSTFetchedResultsTableViewDataSource(fetchRequest: saveStatesFetchRequest, managedObjectContext: DatabaseManager.shared.viewContext) saveStatesDataSource.cellConfigurationHandler = { (cell, saveState, indexPath) in cell.textLabel?.text = saveState.localizedName - configure(cell, recordedObject: saveState) + configure(cell, saveState) } let cheatsFetchRequest = Cheat.fetchRequest() as NSFetchRequest @@ -120,7 +120,7 @@ private extension GameSyncStatusViewController cheatsDataSource.cellConfigurationHandler = { (cell, cheat, indexPath) in cell.textLabel?.text = cheat.name - configure(cell, recordedObject: cheat) + configure(cell, cheat) } let dataSources = [gameDataSource, saveStatesDataSource, cheatsDataSource] as! [RSTArrayTableViewDataSource] diff --git a/Delta/Settings/Syncing/RecordVersionsViewController.swift b/Delta/Settings/Syncing/RecordVersionsViewController.swift index 1fd6bc0..511cd05 100644 --- a/Delta/Settings/Syncing/RecordVersionsViewController.swift +++ b/Delta/Settings/Syncing/RecordVersionsViewController.swift @@ -132,7 +132,7 @@ private extension RecordVersionsViewController let localVersionsDataSource = RSTDynamicTableViewDataSource() localVersionsDataSource.numberOfSectionsHandler = { 1 } - localVersionsDataSource.numberOfItemsHandler = { _ in self.record.localModificationDate != nil ? 1 : 0 } + localVersionsDataSource.numberOfItemsHandler = { [weak self] _ in self?.record.localModificationDate != nil ? 1 : 0 } localVersionsDataSource.cellConfigurationHandler = { [weak self] (cell, _, indexPath) in guard let `self` = self else { return } @@ -157,7 +157,7 @@ private extension RecordVersionsViewController let loadingDataSource = RSTDynamicTableViewDataSource() loadingDataSource.numberOfSectionsHandler = { 1 } - loadingDataSource.numberOfItemsHandler = { _ in (self.versions == nil) ? 1 : 0 } + loadingDataSource.numberOfItemsHandler = { [weak self] _ in (self?.versions == nil) ? 1 : 0 } loadingDataSource.cellIdentifierHandler = { _ in "LoadingCell" } loadingDataSource.cellConfigurationHandler = { (_, _, _) in } diff --git a/Delta/Settings/Syncing/SyncStatusViewController.swift b/Delta/Settings/Syncing/SyncStatusViewController.swift index b94ac50..aa3b56d 100644 --- a/Delta/Settings/Syncing/SyncStatusViewController.swift +++ b/Delta/Settings/Syncing/SyncStatusViewController.swift @@ -66,12 +66,12 @@ private extension SyncStatusViewController let fetchedDataSource = RSTFetchedResultsTableViewDataSource(fetchedResultsController: fetchedResultsController) fetchedDataSource.searchController.searchableKeyPaths = [#keyPath(Game.name)] - fetchedDataSource.cellConfigurationHandler = { (cell, game, indexPath) in + fetchedDataSource.cellConfigurationHandler = { [weak self] (cell, game, indexPath) in let cell = cell as! BadgedTableViewCell cell.textLabel?.text = game.name cell.textLabel?.numberOfLines = 0 - if let gameConflictsCount = self.gameConflictsCount + if let gameConflictsCount = self?.gameConflictsCount { if let count = gameConflictsCount[game.objectID.uriRepresentation()], count > 0 {