先说指针的区别,先创建一个test类
class Test {
deinit
{
print("对象已经销毁")
}
}
class ViewController: UIViewController {
var test1:Test?
weak var test2:Test?
override func viewDidLoad() {
super.viewDidLoad()
test1 = Test()
test2 = Test()
// Do any additional setup after loading the view.
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print(test1)
print(test2)
}
}
程序一运行首先就打印了对象已销毁.因为test2没有强指针指向,一个在栈里面创建的对象出栈就直接释放了,所以viewdidload结束就直接释放了,而test1因为有强指针指向所以还有值,如果是unsafe_unretained指针,不仅会释放,再次使用会直接崩溃
对象已经销毁
Optional(swift_test.Test)
nil
点击屏幕了之后打印的是上面的内容
就不看底层代码了,底层会判断是否是弱引用,强引用会判断是否有引用计数,而弱引用是直接释放的