gpt4 book ai didi

ios - 使用带有自定义容器 View Controller 的滑动手势识别器时发生崩溃

转载 作者:行者123 更新时间:2023-12-01 16:03:42 24 4
gpt4 key购买 nike

XCode 9.1iPhoneX模拟器iPhone6 11.1.2

我浪费了好几天的时间试图找出内存损坏中出现的崩溃(因为每次似乎都不同)。

我已将范围缩小到使用带有滑动手势识别器的(简单)容器 View Controller 。

enter image description here

您可以在导航栏中看到两个(左和右)滑动手势识别器以及两个(上一个和下一个)按钮。 UIViewController 有一个简单的 UILabel

手势识别器配置为:

enter image description here

转换是通过以下方式执行的:

  private func addViewToLayout(view: UIView) {
let views = ["view": view]

view.translatesAutoresizingMaskIntoConstraints = false
container.addSubview(view)

container.addConstraints(
NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|",
options:NSLayoutFormatOptions.alignAllLeft, metrics:nil, views:views))
container.addConstraints(
NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|",
options:NSLayoutFormatOptions.alignAllLeft, metrics:nil, views:views))
}

private func transition(direction: Direction = .left) {
let controllerPrevious = childViewControllers.first

if let controllerNext = storyboard?.instantiateViewController(
withIdentifier: "Test") {
addChildViewController(controllerNext)
addViewToLayout(view: controllerNext.view)

if let controllerPrevious = controllerPrevious {
controllerNext.view.transform = startTransform(direction: direction)

UIView.animate(withDuration: transitionDuration,
animations: {
controllerNext.view.transform = CGAffineTransform.identity
controllerPrevious.view.transform =
self.endTransform(direction: direction)
},
completion: { (finished: Bool) in
controllerPrevious.view.removeFromSuperview()
controllerPrevious.removeFromParentViewController()
controllerNext.didMove(toParentViewController: self)
})
}
}
}

崩溃可能发生在转换期间/之后或离开容器 View Controller 之后。调试器通常在主线程中结束,没有有意义的堆栈跟踪。

enter image description here

崩溃相对容易引起,但并不总是因相同的操作而发生,例如(在设备上运行获取的日志):

EXC_BAD_ACCESS (SIGSEGV)
KERN_INVALID_ADDRESS at 0x4054600000000000
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x0000000180f68428 objc_msgSend + 8
1 UIKit 0x000000018b40dda4 -[UIView _layoutConstraintCleanup] + 204

EXC_CRASH (SIGABRT)
0x0000000000000000, 0x0000000000000000
EXC_CORPSE_NOTIFY
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x000000018181d348 __pthread_kill + 8
1 libsystem_pthread.dylib 0x0000000181931344 pthread_kill$VARIANT$mp + 396
2 libsystem_c.dylib 0x000000018178cfb8 abort + 140
3 libsystem_malloc.dylib 0x0000000181863a08 nanozone_default_reader + 0

请注意,如果仅使用导航栏中的按钮,则不会发生崩溃。

有什么可以帮助找出崩溃的原因吗?

转换后释放当前 subview Controller 时是否需要摆弄手势识别器?

这个question似乎有类似的症状,但实际上没有任何有用的建议。

编辑:

我已将显示崩溃的项目上传到 Dropbox 。编译项目,运行,点击“下一步”,多次左右滑动两次,点击“上一步”,点击“下一步”,重复直到崩溃。有时崩溃会立即发生,有时可能需要 20 个或更多操作。

最佳答案

从您提供的有限数据来看,您似乎有一个内存粉碎机。

您应该使用 Xcode 提供的工具来调试此类问题并提供调查结果。使用项目的静态分析。使用 ASan、NSZombies、GuardMalloc 等运行。

如果您提供此类调查的更多结果,将更容易帮助您确定后续步骤。

关于ios - 使用带有自定义容器 View Controller 的滑动手势识别器时发生崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47586348/

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