【发布时间】:2018-11-15 14:57:49
【问题描述】:
所以我写了一些代码来更好地在保留周期下。
class AnotherViewController : UIViewController{
var closure : ((() -> Int) -> ())!
override func viewDidLoad() {
super.viewDidLoad()
closure = self.someFunctionWithNonescapingClosure
}
func someFunctionWithNonescapingClosure(closure: () -> Int) {
// closure()
}
}
显然,将 viewController 中的函数之一分配给属性闭包,会导致保留周期问题。
但我不知道怎么做?
Self 强烈引用 Closure 但是,在 viewController tp Closure 中分配一个函数,是否会强烈引用 self 到闭包?
谢谢
编辑 ------
显然,如果您通过创建 AnotherViewController 在 Playground 中尝试此操作,对其进行初始化并将其分配给一个变量,然后将变量设置为 nil,它将成功地 deinit the AnotherViewController,但如果您在应用程序中尝试, AnotherViewController 不会被取消初始化。
你可以尝试给AnotherViewController添加一个按钮并关闭它,为了方便,按钮代码是这样的
private func addAButton(){
let button = UIButton()
let buttonBounds = CGRect(x: 0, y: 0, width: 200, height: 200)
let buttonCenter = view.center
button.bounds = buttonBounds
button.center = buttonCenter
view.addSubview(button)
button.backgroundColor = .red
button.addTarget(self, action: #selector(goBack), for: .touchUpInside)
}
@objc func goBack(){
dismiss(animated: true, completion: nil)
}
【问题讨论】:
-
self对闭包有强引用,闭包内部也持有强self,所以退出函数后不会释放自己,会产生retain循环
-
@Tj3n 代码的哪一部分闭包保留了自我?这是我不明白的部分。
-
我在操场上运行了你的代码,如果你将它的实例值设置为 nil,它会显示 AnotherViewController 的 deinit 被调用
-
@avinashpandey 感谢您的帮助.. 但是您可以在 singleViewController 中尝试。添加按钮以关闭 viewController 后,不会调用 deinit
-
@progammingBeignner 能否请您添加带有按钮的代码,它会更有帮助。