控制器一
import UIKit
// 第一个控制器
class ViewController: UIViewController {
var aValue: Int?{
willSet{
print("传值成功--> \(newValue!)") //传值成功打印
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blueColor()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let nv = self.navigationController{
let second = SecondViewController() //第二个控制器
second.sendValue({ //回调方法
// [unowned self]
(i: Int) in //闭包表达式
self.aValue = i
})
nv.pushViewController(second, animated: true)
}
}
}
控制器2
import UIKit
// 第一个控制器
class ViewController: UIViewController {
var aValue: Int?{
willSet{
print("传值成功--> \(newValue!)") //传值成功打印
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blueColor()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let nv = self.navigationController{
let second = SecondViewController() //第二个控制器
second.sendValue({ //回调方法
// [unowned self]
(i: Int) in //闭包表达式
self.aValue = i
})
nv.pushViewController(second, animated: true)
}
}
}
点击Navigation导航栏的返回按钮(相当于pop操作)运行结果:
传值成功--> 1
second 内存释放
second 立即释放的原因是因为
let second = SecondViewController() //第二个控制器
定义在了方法touchesBegin 方法中 局部变量的生命周期-执行完方法体结束,也就释放了 ViewController不会持有SecondViewController的实例。
我们把SecondViewController定义在全局
import UIKit
// 第一个控制器
class ViewController: UIViewController {
<span style="color:#FF6666;"> var second: SecondViewController! //第二个控制器</span>
var aValue: Int?{
willSet{
print("传值成功--> \(newValue!)") //传值成功打印
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blueColor()
second = SecondViewController()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let nv = self.navigationController{
second.sendValue({ //回调方法
// [unowned self]
(i: Int) in //闭包表达式
self.aValue = i
})
nv.pushViewController(second, animated: true)
}
}
运行结果:
传值成功--> 1
为了效验发生了循环引用,我们为ViewController添加方法
func open() {
self.navigationController!.viewControllers = []
}
来释放 NavigationController 对ViewController的引用
这样在内存中 只有ViewController和SecondViewController之间的相互引用。
结果是 deinit方法没有执行,发生循环引用。
解决办法:
second.sendValue({ //回调方法
<span style="color:#FF0000;"> [unowned self]</span>
(i: Int) in //闭包表达式
self.aValue = i
})
闭包表达式前加 [unowned self] 或者[weak self]