为什么在使用.xib文件时没有弱弱的委托人?
我做了一个不使用情节提要的简单项目。它仅使用与UIViewControllers关联的.xib文件。它为用户提供了一个按钮,按下该按钮后,将按下一个新的视图控制器并允许他们返回。如果下面的navDelegate被列为弱,则由于navDelegate始终为nil,所以将不会导航到DetailViewController。
SceneDelegate.swift
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let winScene = scene as? UIWindowScene else {
return
}
window = UIWindow(windowScene: winScene)
AppCoordinator().start()
}
}
AppCoordinator.swift
import UIKit
protocol Coordinator: AnyObject {
func start()
}
class AppCoordinator: Coordinator {
let router = UINavigationController()
func start() {
let vc = RootViewController()
vc.navDelegate = self
router.viewControllers = [vc]
let window = UIApplication.shared.windows.first
window?.rootViewController = router
window?.makeKeyAndVisible()
}
}
extension AppCoordinator: NavDelegate {
func buttonTapped() {
let vc = DetailViewController()
router.pushViewController(vc, animated: true)
}
}
RootViewController.swift
import UIKit
protocol NavDelegate: AnyObject {
func buttonTapped()
}
class RootViewController: UIViewController {
// Does this navDelegate need to be weak when using .xib files?
var navDelegate: NavDelegate?
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func tapDetailButton(_ sender: Any) {
// Always prints 2 no matter how many times I navigate back and forth
let refCount = CFGetRetainCount(navDelegate)
print("Ref Count: \(refCount)")
navDelegate?.buttonTapped()
}
}
DetailViewController.swift
import UIKit
class DetailViewController: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
与xibs无关。
[如果您知道weak
的意思,那么您就知道它的意思是“如果没有其他人对这件事有强烈的指涉,那就让它消失。”
因此,当您说vc.navDelegate = self
,即AppCoordinator实例中的self
时,如果没有其他对该AppCoordinator实例的引用保留了它,则此后它立即消失在烟雾中。
嗯,这个实例的人生故事是什么?
AppCoordinator().start()
那条线是做什么的?它创建一个AppCoordinator实例,在其上调用start
,然后将该AppCoordinator放在地板上,如果没有其他人按住它,则该实例将不复存在。而且没有其他人坚持使用它,因为其他人对此的唯一参考是weak
。