From 92ccbbeceb6dfcef8dc87ba1cf6de74fee717cd4 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 15 Aug 2022 09:03:35 -0500 Subject: [PATCH] fixed memory leak Signed-off-by: Matt Bruce --- .../ViewControllers/TestViewController.swift | 72 +++++++++++-------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/VDSSample/ViewControllers/TestViewController.swift b/VDSSample/ViewControllers/TestViewController.swift index 4b1c8e9..e7d3d26 100644 --- a/VDSSample/ViewControllers/TestViewController.swift +++ b/VDSSample/ViewControllers/TestViewController.swift @@ -11,13 +11,13 @@ import Combine import VDS struct User { - var firstName: String - var lastName: String - - init(firstName: String, lastName: String) { - self.firstName = firstName - self.lastName = lastName - } + var firstName: String + var lastName: String + + init(firstName: String, lastName: String) { + self.firstName = firstName + self.lastName = lastName + } } public protocol Bindable { @@ -34,17 +34,21 @@ extension Bindable { } class TextFieldBindingCell: UIView, Bindable { + deinit { + print("\(Self.self) deinit") + } + //bindable var model: User var subject: CurrentValueSubject? - + let firstNameTextField = TextField() let lastNameTextField = TextField() - + init(model: User) { self.model = model super.init(frame: .zero) - + translatesAutoresizingMaskIntoConstraints = false firstNameTextField.translatesAutoresizingMaskIntoConstraints = false lastNameTextField.translatesAutoresizingMaskIntoConstraints = false @@ -52,20 +56,20 @@ class TextFieldBindingCell: UIView, Bindable { addSubview(firstNameTextField) addSubview(lastNameTextField) print("\(model.firstName) \(model.lastName)") - + firstNameTextField.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true firstNameTextField.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true firstNameTextField.topAnchor.constraint(equalTo: topAnchor).isActive = true firstNameTextField.heightAnchor.constraint(equalToConstant: 50).isActive = true - + lastNameTextField.topAnchor.constraint(equalTo: firstNameTextField.bottomAnchor, constant: 20).isActive = true lastNameTextField.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true lastNameTextField.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true lastNameTextField.heightAnchor.constraint(equalToConstant: 50).isActive = true lastNameTextField.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true - + } - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -73,23 +77,25 @@ class TextFieldBindingCell: UIView, Bindable { func createBinding(with subject: CurrentValueSubject, storeIn subscriptions: inout Set) { self.model = subject.value self.subject = subject - + //add the logic let firstNameSubject = CurrentValueSubject(model.firstName) firstNameTextField.createBinding(with: firstNameSubject, storeIn: &subscriptions) - firstNameSubject.assign(to: \.model.firstName, on: self).store(in: &subscriptions) - firstNameSubject.sink {[weak self] value in - self?.send() - }.store(in: &subscriptions) - + firstNameSubject + .sink {[weak self] value in + guard let self = self else { return } + self.model.firstName = value + self.send() + }.store(in: &subscriptions) + let lastNameSubject = CurrentValueSubject(model.lastName) lastNameTextField.createBinding(with: lastNameSubject, storeIn: &subscriptions) - lastNameSubject.assign(to: \.model.lastName, on: self).store(in: &subscriptions) - lastNameSubject.sink {[weak self] value in - guard let self = self else { return } - self.send() - }.store(in: &subscriptions) - + lastNameSubject + .sink {[weak self] value in + guard let self = self else { return } + self.model.lastName = value + self.send() + }.store(in: &subscriptions) } } @@ -97,7 +103,7 @@ class TextFieldBindingCell: UIView, Bindable { var user = User(firstName: "Joe", lastName: "User") private var subscriptions = Set() - + required init() { super.init(nibName: nil, bundle: nil) } @@ -111,7 +117,11 @@ class TextFieldBindingCell: UIView, Bindable { view.backgroundColor = .white let subject = CurrentValueSubject(user) - subject.assign(to: \.user, on: self).store(in: &subscriptions) + subject + .sink{ [weak self] updatedModel in + self?.user = updatedModel + } + .store(in: &subscriptions) let nameTextField = TextFieldBindingCell(model: user) nameTextField.createBinding(with: subject, storeIn: &subscriptions) @@ -151,7 +161,7 @@ extension UITextField { } public func createBinding(with subject: CurrentValueSubject, - storeIn subscriptions: inout Set) { + storeIn subscriptions: inout Set) { subject.sink { [weak self] (value) in if value != self?.text { @@ -174,14 +184,14 @@ class TextField: UITextField { bottom: 10, right: 20 ) - + override func textRect(forBounds bounds: CGRect) -> CGRect { layer.borderColor = UIColor.black.cgColor layer.borderWidth = 1 let rect = super.textRect(forBounds: bounds) return rect.inset(by: textPadding) } - + override func editingRect(forBounds bounds: CGRect) -> CGRect { layer.borderColor = UIColor.black.cgColor layer.borderWidth = 1