弱的委托和.xib文件

时间:2020-04-26 18:55:52

标签: ios swift delegates xib

为什么使用.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之类的名称,因此对于它是否应该很弱没有任何困惑。

1 个答案:

答案 0 :(得分:0)

与xibs无关。还是代表,真的。

如果您知道weak的含义,那么您就知道它的意思是“如果没有其他人对这件事有强烈的指涉,那就让它消失。”

因此,当您说vc.navDelegate = self(在AppCoordinator实例中的self处)时,如果没有其他对该AppCoordinator实例的引用将其保留,则此后它立即消失在烟雾中。

那么,这个实例的人生故事是什么?

 AppCoordinator().start()

那行是做什么的?它创建一个AppCoordinator实例,在其上调用start,然后将该AppCoordinator放到地板上,如果没有其他人按住它,则该实例将不复存在。而且没有人 坚持使用它,因为其他人对它的唯一参考是weak

相关问题