2017-12-01 10 views
0

XCodeの9.1 iPhoneXシミュレータ iPhone6 11.1.2クラッシュあると思われるので、私は、メモリの破損(マニフェストに見えるクラッシュを追跡しようとする日を無駄にしているカスタムコンテナビューコントローラとのスワイプジェスチャー認識装置

を使用して毎回異なる)。

私はスワイプジェスチャー認識機能付き(単純な)コンテナビューコントローラを使用するように絞りました。

enter image description here

あなたは、ナビゲーションバーに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) 
      }) 
     } 
    } 
    } 

enter image description here

遷移をすることにより行われますコントローラ。デバッガは通常、メインスレッドで意味のあるスタックトレースなしで終了します。

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 

ノート、クラッシュは発生しません。

クラッシュの原因を特定するのに役立つものはありますか?

移行後に現在の子ビューコントローラーを解放するときにジェスチャー認識機能を使用する必要がありますか?

このquestionには同様の症状があるようですが、実際には何の示唆もありません。

編集:私はDropboxにクラッシュを発揮するプロジェクトをアップロードしている

。プロジェクトをコンパイルして実行し、「次へ」をタップし、左右に2回タッチして「戻る」をタップし、「次へ」をタップしてクラッシュするまで繰り返します。クラッシュが直ちに起きることがあります。時には20回以上のアクションが必要な場合もあります。

+0

あなたの完了ブロックの移行で - あなたはその部分を削除し、クラッシュがまだ起こるかどうか確認できますか?競合状態に陥っている可能性があります。そのため、エラーには一貫性がありません。 (私のデベロッパーのMACやIDはそれ以上テストしていません) – solenoid

+0

参照のために、カスタムのアニメーション化されたトランジションを行うリンゴ提供のメソッドがあります。https://developer.apple.com/documentation/uikit/uiviewcontrollertransitioningdelegate/1622037-animationcontroller – solenoid

+0

@solenoid私は 'removeFromParentViewController'を削除してから、' didMove'も試みました。クラッシュはまだ起こった。 – Matt

答えて

0

あなたが提供している限られたデータから、あなたは記憶が賢明であるように見えます。

Xcodeが提供するツールを使用して、このような問題をデバッグし、その調査結果を提供する必要があります。プロジェクトの静的分析を使用します。 ASan、NSZombies、GuardMallocなどで実行します。

このような調査の結果がさらに得られる場合は、次のステップを理解するのが簡単になります。

+0

私はすべての警告( '' -Weverything'')を有効にし、分析し、消毒剤、ゾンビ、GuardMallocをオンにしました。その結果はまったくありません。私は、 "メモリスマッシャー"は、ジェスチャーレコグナイザーと、コンテナビューから追加されたり削除されたビュー/コントローラーの間のやりとりであると思います。 – Matt

+0

私はInstrumentsを使ってみましたが、私は何をしているのか分かりません。何も明白ではなかった。クラッシュを監視するために実行できるプロジェクトの主な質問の編集をご覧ください。 – Matt

0

これは単純なことかもしれませんが、Interface Builderと2本の指のスワイプに問題があります。私はそれを1つの指を割り当てるとき、それはうまく動作しますが、それは2本の指でクラッシュします。

私はIBで1本の指にしておき、viewDidLoadで2本の指に変えれば、問題はなくなります。

関連する問題