gpt4 book ai didi

ios - 在 AppDelegate 中对初始 ViewController 使用强委托(delegate)

转载 作者:行者123 更新时间:2023-11-28 10:59:26 24 4
gpt4 key购买 nike

我的初始 GameViewController 有一个 GameDelegate 的委托(delegate)属性。我在 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
}

这只适用于我的委托(delegate)很强:

class GameViewController: UIViewController{

var delegate: GameDelegate?

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

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

使用弱委托(delegate)将导致应用程序崩溃,因为在呈现 GameViewController 之后委托(delegate)将为 nil。

我的问题是:这种方法安全吗?如果不安全,应该如何操作?我读过有关委托(delegate)的信息,建议将其保留为弱变量以防止保留周期。我没有使用 Storyboard。

最佳答案

问题在于您是在函数中声明 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

关于ios - 在 AppDelegate 中对初始 ViewController 使用强委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41476606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com