2024-12-03
与内存管理有关。
默认是strong
,不用写关键词。
var str = "hello"
如果是weak
,需要在前面注明:
weak var str = "hello"
例子:
class Child {
weak var balloon = "hello"
}
var joe = Child()
如果joe不见了,那么weak变量balloon也会从内存消失。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("hello")
view.backgroundColor = UIColor(.white)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Done", style: .cancel, handler: { [weak self] _ in
self?.doSomething()
}))
present(alert, animated: true)
}
private func doSomething(){
print("something")
}
}
说明:
如果不用weak self,当viewController声明了alert,因此进行了引用;alert在closure中又声明了self中的function,即引用了viewController。
相互引用,因此系统无法回收内存,造成「内存泄露」,即这些内存永远无法被重新利用。
加上weak self,alert消失后,由于不是强引用viewController,内存会自然释放。