From a35bfe50eea7ef378fb961d1e8a66d311157aee3 Mon Sep 17 00:00:00 2001 From: Martin Walsh Date: Thu, 15 Dec 2016 10:54:32 +0000 Subject: [PATCH 1/2] Fix Memory leak AuthStyle Fix retain cycles in presenters --- Lock/AuthStyle.swift | 4 ++-- Lock/DatabaseForgotPasswordPresenter.swift | 4 ++-- Lock/DatabasePresenter.swift | 7 ++++--- Lock/EnterpriseActiveAuthPresenter.swift | 4 ++-- Lock/EnterpriseDomainPresenter.swift | 6 +++--- Lock/MultifactorPresenter.swift | 4 ++-- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Lock/AuthStyle.swift b/Lock/AuthStyle.swift index 620ab6e82..6a1af01e5 100644 --- a/Lock/AuthStyle.swift +++ b/Lock/AuthStyle.swift @@ -23,7 +23,7 @@ import UIKit /// Style for AuthButton -public class AuthStyle { +public struct AuthStyle { /// Name that will be used for titles. e.g. 'Login with Auth0' let name: String @@ -52,7 +52,7 @@ public class AuthStyle { - returns: a new style */ - public convenience init(name: String, color: UIColor = UIColor.a0_orange, foregroundColor: UIColor = .white, withImage image: LazyImage = LazyImage(name: "ic_auth_auth0", bundle: bundleForLock())) { + public init(name: String, color: UIColor = UIColor.a0_orange, foregroundColor: UIColor = .white, withImage image: LazyImage = LazyImage(name: "ic_auth_auth0", bundle: bundleForLock())) { self.init(name: name, normalColor: color, highlightedColor: color.a0_darker(0.3), foregroundColor: foregroundColor, withImage: image) } diff --git a/Lock/DatabaseForgotPasswordPresenter.swift b/Lock/DatabaseForgotPasswordPresenter.swift index 175290457..1a7617772 100644 --- a/Lock/DatabaseForgotPasswordPresenter.swift +++ b/Lock/DatabaseForgotPasswordPresenter.swift @@ -53,7 +53,7 @@ class DatabaseForgotPasswordPresenter: Presentable, Loggable { input.showError() } } - let action = { (button: PrimaryButton) in + let action = { [weak form] (button: PrimaryButton) in self.messagePresenter?.hideCurrent() self.logger.info("request forgot password for email \(self.interactor.email)") let interactor = self.interactor @@ -73,7 +73,7 @@ class DatabaseForgotPasswordPresenter: Presentable, Loggable { } } view.primaryButton?.onPress = action - view.form?.onReturn = {_ in + view.form?.onReturn = { [unowned view] _ in guard let button = view.primaryButton else { return } action(button) } diff --git a/Lock/DatabasePresenter.swift b/Lock/DatabasePresenter.swift index 7ae32be7b..e6a8623d4 100644 --- a/Lock/DatabasePresenter.swift +++ b/Lock/DatabasePresenter.swift @@ -59,7 +59,7 @@ class DatabasePresenter: Presentable, Loggable { let allow = self.options.allow let database = DatabaseOnlyView(allowedModes: allow) database.navigator = self.navigator - database.switcher?.onSelectionChange = { [weak database] switcher in + database.switcher?.onSelectionChange = { [unowned self, weak database] switcher in let selected = switcher.selected guard let view = database else { return } self.logger.debug("selected \(selected)") @@ -130,8 +130,9 @@ class DatabasePresenter: Presentable, Loggable { } - view.form?.onReturn = { field in - guard let button = view.primaryButton, field.returnKey == .done else { return } // FIXME: Log warn + let primaryButton = view.primaryButton + view.form?.onReturn = { [weak primaryButton] field in + guard let button = primaryButton, field.returnKey == .done else { return } // FIXME: Log warn action(button) } view.primaryButton?.onPress = action diff --git a/Lock/EnterpriseActiveAuthPresenter.swift b/Lock/EnterpriseActiveAuthPresenter.swift index b56205660..fc2168fc6 100644 --- a/Lock/EnterpriseActiveAuthPresenter.swift +++ b/Lock/EnterpriseActiveAuthPresenter.swift @@ -65,7 +65,7 @@ class EnterpriseActiveAuthPresenter: Presentable, Loggable { } } - let action = { (button: PrimaryButton) in + let action = { [weak form] (button: PrimaryButton) in self.messagePresenter?.hideCurrent() self.logger.info("Enterprise password connection started: \(self.interactor.identifier), \(self.interactor.connection)") let interactor = self.interactor @@ -87,7 +87,7 @@ class EnterpriseActiveAuthPresenter: Presentable, Loggable { } view.primaryButton?.onPress = action - view.form?.onReturn = {_ in + view.form?.onReturn = { [unowned view] _ in guard let button = view.primaryButton else { return } action(button) } diff --git a/Lock/EnterpriseDomainPresenter.swift b/Lock/EnterpriseDomainPresenter.swift index 68c02b20a..8aa5be084 100644 --- a/Lock/EnterpriseDomainPresenter.swift +++ b/Lock/EnterpriseDomainPresenter.swift @@ -67,7 +67,7 @@ class EnterpriseDomainPresenter: Presentable, Loggable { let form = view.form view.ssoBar?.isHidden = self.interactor.connection == nil - view.form?.onValueChange = { input in + view.form?.onValueChange = { [unowned view ] input in self.messagePresenter?.hideCurrent() view.ssoBar?.isHidden = true @@ -85,7 +85,7 @@ class EnterpriseDomainPresenter: Presentable, Loggable { } } - let action = { (button: PrimaryButton) in + let action = { [weak form] (button: PrimaryButton) in // Check for credential auth if let connection = self.interactor.connection, self.options.enterpriseConnectionUsingActiveAuth.contains(connection.name) { guard self.navigator?.navigate(.enterpriseActiveAuth(connection: connection)) == nil else { return } @@ -112,7 +112,7 @@ class EnterpriseDomainPresenter: Presentable, Loggable { } view.primaryButton?.onPress = action - view.form?.onReturn = {_ in + view.form?.onReturn = { [unowned view] _ in guard let button = view.primaryButton else { return } action(button) } diff --git a/Lock/MultifactorPresenter.swift b/Lock/MultifactorPresenter.swift index f08065996..4b0d11145 100644 --- a/Lock/MultifactorPresenter.swift +++ b/Lock/MultifactorPresenter.swift @@ -52,7 +52,7 @@ class MultifactorPresenter: Presentable, Loggable { input.showError() } } - let action = { (button: PrimaryButton) in + let action = { [weak form] (button: PrimaryButton) in self.messagePresenter?.hideCurrent() self.logger.debug("resuming with mutifactor code \(self.interactor.code)") let interactor = self.interactor @@ -68,7 +68,7 @@ class MultifactorPresenter: Presentable, Loggable { } } } - view.form?.onReturn = { _ in + view.form?.onReturn = { [unowned view]_ in guard let button = view.primaryButton else { return } action(button) } From 213ad1ec91ce34226e2665bf56cf3896863d1575 Mon Sep 17 00:00:00 2001 From: Martin Walsh Date: Thu, 15 Dec 2016 12:19:37 +0000 Subject: [PATCH 2/2] Optimise retains --- Lock/DatabaseOnlyView.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Lock/DatabaseOnlyView.swift b/Lock/DatabaseOnlyView.swift index 7a47efb66..6e788c77d 100644 --- a/Lock/DatabaseOnlyView.swift +++ b/Lock/DatabaseOnlyView.swift @@ -129,21 +129,21 @@ class DatabaseOnlyView: UIView, DatabaseView { passwordPolicyView.isHidden = true form.passwordField.errorLabel?.removeFromSuperview() - form.passwordField.onBeginEditing = { [unowned passwordPolicyView] _ in + form.passwordField.onBeginEditing = { _ in passwordPolicyView.isHidden = false } - form.passwordField.onEndEditing = { [unowned passwordPolicyView] _ in + form.passwordField.onEndEditing = { _ in passwordPolicyView.isHidden = true } - form.emailField.onReturn = { [unowned form, unowned passwordPolicyView] _ in - if form.emailField.nextField == form.passwordField { + form.emailField.onReturn = { [weak form] _ in + if form?.emailField.nextField == form?.passwordField { self.navigator?.scroll(toPosition: CGPoint(x: 0, y: passwordPolicyView.intrinsicContentSize.height), animated: true) } } - form.usernameField?.onReturn = { [unowned form, unowned passwordPolicyView] _ in - if form.usernameField?.nextField == form.passwordField { + form.usernameField?.onReturn = { [weak form] _ in + if form?.usernameField?.nextField == form?.passwordField { self.navigator?.scroll(toPosition: CGPoint(x: 0, y: passwordPolicyView.intrinsicContentSize.height), animated: true) } }