Swift iOS -storyboard.instantiateViewController(withIdentifier:) 导致保留周期
Swift iOS -storyboard.instantiateViewController(withIdentifier:) causing retain cycle
我使用的是我的物理设备,而不是模拟器。
我正在使用 storyboard.instantiateViewController(withIdentifier:)
实例化一个 vc 并以模态方式呈现它。我使用 presentingViewController?.dismiss(animated: true, completion: nil)
关闭它。在呈现的 vc 中,我在 Deinit
中有一个永远不会运行的打印方法。
我转到 工具 > 分配 > 统计信息 > 分配摘要 > MyApp.ThePresenedController,它显示 2 张脸说有问题。当我单击它们时,它带我到呈现 vc 的代码,我在其中实例化了要呈现的 vc 并将其突出显示为绿色。在显示的 vc 被关闭后,它不会从 Allocation Summary 列表中删除。在呈现的 vc 中没有对呈现的 vc 的引用,因此这不是 weak var
问题。
为什么 storyboard.instantiateViewController(withIdentifier:)
给我带来了问题?
呈现VC:
@IBAction func forgotPasswordButtonTapped(_ sender: UIButton) {
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let forgotPasswordVC = mainStoryboard.instantiateViewController(withIdentifier: "ForgotPasswordController") as! ForgotPasswordController
let navVC = UINavigationController(rootViewController: forgotPasswordVC)
present(navVC, animated: true, completion: nil)
}
提出VC:
@IBAction func cancelButtonTapped(_ sender: UIButton) {
presentingViewController?.dismiss(animated: true, completion: nil)
}
deinit{
print("I've been dismissed")
}
我也在 AppDelegate 中使用相同的 storyboard.instantiateViewController(withIdentifier:)
代码,出现相同的 2 个面孔和突出显示的绿色错误。
AppDelegate 已完成启动:
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if userDoesThis {
// if true this first line will highlight green
let thisVC: ThisController = mainStoryboard.instantiateViewController(withIdentifier: "ThisController") as! ThisController
let nav = UINavigationController(rootViewController: thisVC)
} else {
// if false this first line will highlight green
let thatVC: ThatController = mainStoryboard.instantiateViewController(withIdentifier: "ThisController") as! ThatController
let nav = UINavigationController(rootViewController: thatVC)
}
window?.rootViewController = nav
window?.makeKeyAndVisible()
return true
正如@StevenFisher 在评论中建议的那样,问题不是绿色突出显示的行本身,而是我忽略的闭包,并且没有用 [weak self]
声明。我读过一些文章说按匿名面会将您带到有问题的代码行,但史蒂夫指出这可能不是问题所在,而是 can/will 而是将您带到问题开始的地方。在我的情况下,它让我知道文件一实例化就在文件某处出现问题,而不是行本身。
我使用的是我的物理设备,而不是模拟器。
我正在使用 storyboard.instantiateViewController(withIdentifier:)
实例化一个 vc 并以模态方式呈现它。我使用 presentingViewController?.dismiss(animated: true, completion: nil)
关闭它。在呈现的 vc 中,我在 Deinit
中有一个永远不会运行的打印方法。
我转到 工具 > 分配 > 统计信息 > 分配摘要 > MyApp.ThePresenedController,它显示 2 张脸说有问题。当我单击它们时,它带我到呈现 vc 的代码,我在其中实例化了要呈现的 vc 并将其突出显示为绿色。在显示的 vc 被关闭后,它不会从 Allocation Summary 列表中删除。在呈现的 vc 中没有对呈现的 vc 的引用,因此这不是 weak var
问题。
为什么 storyboard.instantiateViewController(withIdentifier:)
给我带来了问题?
呈现VC:
@IBAction func forgotPasswordButtonTapped(_ sender: UIButton) {
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let forgotPasswordVC = mainStoryboard.instantiateViewController(withIdentifier: "ForgotPasswordController") as! ForgotPasswordController
let navVC = UINavigationController(rootViewController: forgotPasswordVC)
present(navVC, animated: true, completion: nil)
}
提出VC:
@IBAction func cancelButtonTapped(_ sender: UIButton) {
presentingViewController?.dismiss(animated: true, completion: nil)
}
deinit{
print("I've been dismissed")
}
我也在 AppDelegate 中使用相同的 storyboard.instantiateViewController(withIdentifier:)
代码,出现相同的 2 个面孔和突出显示的绿色错误。
AppDelegate 已完成启动:
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if userDoesThis {
// if true this first line will highlight green
let thisVC: ThisController = mainStoryboard.instantiateViewController(withIdentifier: "ThisController") as! ThisController
let nav = UINavigationController(rootViewController: thisVC)
} else {
// if false this first line will highlight green
let thatVC: ThatController = mainStoryboard.instantiateViewController(withIdentifier: "ThisController") as! ThatController
let nav = UINavigationController(rootViewController: thatVC)
}
window?.rootViewController = nav
window?.makeKeyAndVisible()
return true
正如@StevenFisher 在评论中建议的那样,问题不是绿色突出显示的行本身,而是我忽略的闭包,并且没有用 [weak self]
声明。我读过一些文章说按匿名面会将您带到有问题的代码行,但史蒂夫指出这可能不是问题所在,而是 can/will 而是将您带到问题开始的地方。在我的情况下,它让我知道文件一实例化就在文件某处出现问题,而不是行本身。