XCodeの9.1 iPhoneXシミュレータ iPhone6 11.1.2クラッシュあると思われるので、私は、メモリの破損(マニフェストに見えるクラッシュを追跡しようとする日を無駄にしているカスタムコンテナビューコントローラとのスワイプジェスチャー認識装置
を使用して毎回異なる)。
私はスワイプジェスチャー認識機能付き(単純な)コンテナビューコントローラを使用するように絞りました。
あなたは、ナビゲーションバーに2つ(左右)スワイプジェスチャー認識装置とも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)
})
}
}
}
:
遷移をすることにより行われますコントローラ。デバッガは通常、メインスレッドで意味のあるスタックトレースなしで終了します。
クラッシュを引き起こす相対簡単ですが、常に例えば、同じ行為から発生しません。 (デバイス上で実行することによって得られたログ):ナビゲーションバーのボタンのみが使用されている場合
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にクラッシュを発揮するプロジェクトをアップロードしている
。プロジェクトをコンパイルして実行し、「次へ」をタップし、左右に2回タッチして「戻る」をタップし、「次へ」をタップしてクラッシュするまで繰り返します。クラッシュが直ちに起きることがあります。時には20回以上のアクションが必要な場合もあります。
あなたの完了ブロックの移行で - あなたはその部分を削除し、クラッシュがまだ起こるかどうか確認できますか?競合状態に陥っている可能性があります。そのため、エラーには一貫性がありません。 (私のデベロッパーのMACやIDはそれ以上テストしていません) – solenoid
参照のために、カスタムのアニメーション化されたトランジションを行うリンゴ提供のメソッドがあります。https://developer.apple.com/documentation/uikit/uiviewcontrollertransitioningdelegate/1622037-animationcontroller – solenoid
@solenoid私は 'removeFromParentViewController'を削除してから、' didMove'も試みました。クラッシュはまだ起こった。 – Matt