Skip to content

Instantly share code, notes, and snippets.

@manupstairs
Last active December 1, 2017 07:33
Show Gist options
  • Save manupstairs/b8c58d581dd69e1a11bfe895a640a591 to your computer and use it in GitHub Desktop.
Save manupstairs/b8c58d581dd69e1a11bfe895a640a591 to your computer and use it in GitHub Desktop.
Seems shareFile method not work because UIButton addTarget is weak reference
import UIKit
class ViewController: UIViewController {
var testButton: CustomButton {
let buttonPresenter = ButtonPresenter()
return buttonPresenter.shareButton
}
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(testButton)
}
}
class CustomButton: UIButton {
//shareFile method will work if I delete 'weak'
weak var presenter: ButtonPresenter?
init(presenter: ButtonPresenter) {
self.presenter = presenter
super.init(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class ButtonPresenter {
lazy var shareButton: CustomButton = {
let button = CustomButton(presenter: self)
button.setTitle("test", for: .normal)
button.addTarget(self, action: #selector(shareFile(_:)), for: .touchUpInside)
return button
}()
@objc private func shareFile(_ button: UIButton) {
button.setTitle("share file\(arc4random())", for: .normal)
}
}
import Foundation
protocol ContentDelegate: class {
func changeText(_ content: Content)
}
class Content {
var text: String = ""
//changeText will work if I delete 'weak'
weak var delegate: ContentDelegate?
}
class Presenter: ContentDelegate {
lazy var content: Content = {
let content = Content()
content.text = "111"
content.delegate = self
return content
}()
func changeText(_ content: Content) {
content.text = "222"
}
}
class TestClass {
lazy var testContent: Content = {
let presenter = Presenter()
return presenter.content
}()
}
let testClass = TestClass()
testClass.testContent.delegate?.changeText(testClass.testContent)
print(testClass.testContent.text)
class Content1 {
var text: String = ""
var action: ((Content1) -> Void)?
}
class Presenter1 {
lazy var content: Content1 = {
let content = Content1()
content.text = "333"
content.action = changeText1
return content
}()
func changeText1(_ content: Content1) {
content.text = "444"
}
}
class TestClass {
lazy var testContent: Content1 = {
let presenter = Presenter1()
return presenter.content
}()
}
let testClass = TestClass()
if let action = testClass.testContent.action {
action(testClass.testContent)
}
print(testClass.testContent.text)
@manupstairs
Copy link
Author

manupstairs commented Dec 1, 2017

  • 第一个代码段里,CustomButton如果不存在对ButtonPresenter的strong reference,点击button触发touchUpInside,并不能执行shareFile方法。
  • 第二个代码段,weak reference同样会导致Presenter对象被释放,Contentdelegate将为nil
  • 第三个代码段,不使用Delegate,直接传递function的话,会因为不能添加weak,导致强引用从而隐藏了生命周期的问题
  • 推测UIButton的AddTarget与参数的target和action之间为弱引用关系

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment