为什么使用.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()
}
}
因此,通过@matt进一步了解,似乎如果您将AppCoordinator作为SceneDelegate的实例变量,则可以将navDelegate作为弱项。我想错误是调用navDelegate委托。它应该只被称为navHelper之类的名称,因此对于它是否应该很弱没有任何困惑。
答案 0 :(得分:0)
与xibs无关。还是代表,真的。
如果您知道weak
的含义,那么您就知道它的意思是“如果没有其他人对这件事有强烈的指涉,那就让它消失。”
因此,当您说vc.navDelegate = self
(在AppCoordinator实例中的self
处)时,如果没有其他对该AppCoordinator实例的引用将其保留,则此后它立即消失在烟雾中。
那么,这个实例的人生故事是什么?
AppCoordinator().start()
那行是做什么的?它创建一个AppCoordinator实例,在其上调用start
,然后将该AppCoordinator放到地板上,如果没有其他人按住它,则该实例将不复存在。而且没有人 坚持使用它,因为其他人对它的唯一参考是weak
。