gpt4 book ai didi

ios - IBOutlet 崩溃与 EXC_BAD_ACCESS 即使不是零

转载 作者:IT王子 更新时间:2023-10-29 05:15:57 25 4
gpt4 key购买 nike

在一个 UIViewController (rolePageController) 中,我配置了另一个 UIViewController (drawerController) 并从角色页面传递给它 2 个 UIView,这将成为 drawerController 配置的一部分。一旦 drawerController 尝试从 rolePageController 访问 IBOutlet View ,它就会崩溃并显示 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)。

在第一个 VC (rolePageController) 中,这里是 IBOutlets:

@IBOutlet var rolePageDrawerView: UIView!
@IBOutlet var rolePageContentView: UIView!

在 rolePageController.viewDidLoad() 中,我调用了 drawerController.configureDrawer(...):

override func viewDidLoad() {
super.viewDidLoad()

//other stuff happens here

let drawerController = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "drawerController") as! DrawerViewController
drawerController.configureDrawer(drawerContainerView: self.rolePageDrawerView, overlaidView: self.rolePageContentView)

//other stuff here
}

DrawerViewController 协议(protocol)定义为:

protocol DrawerViewController where Self: UIViewController {
func configureDrawer(drawerContainerView: UIView, overlaidView: UIView)
}

这是 configureDrawer(...) 函数的代码:

private var drawerParentView: UIView!
private var overlaidByDrawerView: UIView!


func configureDrawer(drawerContainerView: UIView, overlaidView: UIView) {
self.drawerParentView = drawerContainerView
self.overlaidByDrawerView = overlaidView
}

在调试器中注意到调用的 drawerController 实例与接收调用的 self 实例不匹配。这是将被调用的实例的地址:

enter image description here

这是我进入调用时实例的地址:

enter image description here

调用前drawerController的地址不是我进入调用时self的地址。那永远不应该发生。

我创建了一个简化的项目来重现 https://github.com/ksoftllc/DynamicStackBufferOverflow 处的崩溃.

解决方案解决方案原来是从 DrawerViewController 协议(protocol)中删除 where 子句。

protocol DrawerViewController where Self: UIViewController {
func configureDrawer(drawerContainerView: UIView, overlaidView: UIView)
}

最佳答案

找到了有问题的代码,但我不知道为什么这会导致我看到的错误。 drawerController 符合 DrawerViewController 协议(protocol),定义为:

protocol DrawerViewController where Self: UIViewController {
func configureDrawer(drawerContainerView: UIView, overlaidView: UIView)
}

当我删除 Where 条件时,它不再崩溃。

protocol DrawerViewController {
func configureDrawer(drawerContainerView: UIView, overlaidView: UIView)
}

where 子句对于程序的正确运行实际上不是必需的,因此我将在没有它的情况下继续。

更新我向 swift.org 提交了错误并收到了回复。 Swift 4.2 不支持向协议(protocol)添加 where 子句,但 Swift 5.0 将支持它。此外,@J Doe 在下面发布了一种通过更新 Xcode 工具包来实现此目的的方法。

关于ios - IBOutlet 崩溃与 EXC_BAD_ACCESS 即使不是零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662428/

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