【发布时间】:2017-12-01 03:46:03
【问题描述】:
XCode 9.1 iPhoneX模拟器 iPhone6 11.1.2
我已经浪费了好几天的时间来试图追踪一个似乎表现为内存损坏的崩溃(因为它似乎每次都不一样)。
我已将其范围缩小为使用带有滑动手势识别器的(简单)容器视图控制器。
您可以在导航栏中看到两个(左和右)滑动手势识别器以及两个(上一个和下一个)按钮。 UIViewController 有一个简单的UILabel。
手势识别器配置为:
过渡由以下人员执行:
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)
})
}
}
}
崩溃可能发生在转换期间/之后,或者在离开 Container View Controller 之后发生。调试器通常在没有有意义的堆栈跟踪的主线程中结束。
崩溃相对容易导致,但并不总是由相同的操作发生,例如(在设备上运行得到的日志):
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
请注意,如果仅使用导航栏中的按钮,不会发生崩溃。
有什么可以帮助找出崩溃的原因吗?
在转换后释放当前子视图控制器时,手势识别器是否需要摆弄?
这个question 似乎有类似的症状,但实际上并没有任何有用的建议。
编辑:
我已将一个显示崩溃的项目上传到Dropbox。编译项目,运行,点击下一步,使用两次左右滑动多次,点击返回,点击下一步,重复直到崩溃。有时崩溃是立即发生的,有时可能需要 20 次或更多操作。
【问题讨论】:
-
在过渡中的完成块中 - 您可以删除该部分并查看崩溃是否仍然发生?我觉得您可能会遇到竞争状况,这就是错误不一致的原因。 (不是在我的开发 mac 或 id 测试它更多)
-
仅供参考,有一个苹果提供的方法来做自定义动画过渡developer.apple.com/documentation/uikit/…
-
@solenoid 我尝试删除
removeFromParentViewController,然后也删除了didMove。崩溃仍然发生。 -
我已经提交了一个错误 35792348。也许 Apple 的某个人可以弄清楚发生了什么。
标签: ios crash uicontainerview uiswipegesturerecognizer