繁体   English   中英

在AppDelegate中为初始ViewController使用强委托

[英]Using strong delegate for initial ViewController in AppDelegate

我最初的GameViewController具有的委托属性GameDelegate 我在AppDelegate设置此属性:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    //Set initial view controller
    window = UIWindow(frame: UIScreen.main.bounds)
    if let window = window {
        let gameTracker = GameTracker()
        let gameViewController = GameViewController()
        gameViewController.delegate = gameTracker
        window.rootViewController = gameViewController
        window.makeKeyAndVisible()
    }
    return true
}

这仅在我的代表很强时才起作用:

class GameViewController: UIViewController{

        var delegate: GameDelegate?

        var gameScore: GameScore {
            return (delegate!.gameScore)
        }

        override func viewDidLoad() {
            super.viewDidLoad()
        }
    }

使用弱的委托将导致应用程序崩溃,因为在呈现GameViewController之后委托将为零。

我的问题是:这种方法安全吗?如果不安全,应该怎么做? 我已经阅读了有关委托的内容,建议将其保留为弱变量,以防止保留周期。 我没有使用情节提要。

问题在于您是在函数中而不是在类级变量中声明gameTracker 当函数退出时, AppDelegate对它的引用将立即释放,而GameViewController仅有其引用。

解决此问题的方法是在您的AppDelegate gameTracker声明为类级变量:

var gameTracker: GameTracker?

您需要将其声明为可选的,因为您只想在满足if条件时实例化它:

if let window = window {
    self.gameTracker = GameTracker()
    let gameViewController = GameViewController()
    gameViewController.delegate = self.gameTracker
    window.rootViewController = gameViewController
    window.makeKeyAndVisible()
}

如果执行此操作,则可以在GameViewController中将delegate声明为weak

安全的方法是使用弱委托。 如果您处理nil,那应该不是问题。

weak var delegate: GameDelegate?

var gameScore: GameScore? {
    return delegate?.gameScore
}

您是否打算在'gameScore'更改时调用'delegate'? 如果要保存“ gameScore”并返回“ delegate”,则应使用属性观察器。

var gameScore: GameScore {
    didSet {
        delegate?.gameScore
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM