2016-10-25 1 views
0

私が取り組んでいるアプリケーションには、多くのビジュアル形式の制約があります。 1回の操作でネットワークリクエストを集めた後、EXC_BAD_ACCESSクラッシュを開始しました。 NSLayoutConstraint(item ....)イニシャライザによって手作業で制約を作成すると、クラッシュすることはありません。ここでNSLayoutConstraint EXC_BAD_ACCESSのためにVFLがクラッシュする

はクラッシュが私のコードで起こる行です:

enter image description here

そしてここでは、クラッシュログです: enter image description here

このクラッシュを引き起こす可能性がありますか?どのように修正できますか?

+0

これは基本的には問題ありません(下の関連のない警告を参照)。わたしにはできる。この 'addConstraints'はどこで呼びますか?明らかに、それは 'UIView'サブクラスになければなりませんが、正確にこれをやっているのはどこですか?要するに、[MCVE](http://stackoverflow.com/help/mcve)が必要です。私はあなたがここで提供したものに基づいて問題を再現することはできません。 – Rob

+0

無関係で、一般的に 'options:[]'と言います。 'NSLayoutFormatOptions'は' OptionSet'で、空のセットは '[]'です。実際、 'constraints'メソッドでは' options'パラメータは省略可能で、 '[]'にデフォルト設定されていますので、 'options:[]'も省略することもできます。 – Rob

答えて

0

NSLayoutConstraintsの配列を作成してからアレイからすべてを一度にアクティブにするときに同じ問題が発生しました。

ビューから離れたところに戻ってきたときに戻ってくると、ビューが別のメモリー割り当てに割り当てられ、Bad Access Errorが発生することがあります。

ここで何が起こりますか。新しい制約は、ビューがロードされるたびに(配列を追加して、.viewDidLoad()関数から、またはビューが再び表示されるたびに読み込まれる同様の関数からアクティブにすると仮定して)配列に追加されます。

アレイから離れて移動すると、アレイ自体が空にならず、古い制約もアレイに残ります。ビューに戻って制約をアクティブにしようとすると、システムは古い制約をもう一度アクティブにしようとします(制約が参照しているビューが含まれていないメモリを参照しています)。

これを修正するには、新しい制約を追加する前に、アレイ上で.RemoveAll()を呼び出してください。これにより、古い制約がすべて削除され、システムはそれらをアクティブにしようとしません。

例を示します。

var initialConstraints = [NSLayoutConstraint]() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Empty the array once the view loads 
    initialConstraints.removeAll() 

    // Add your constraints like normal 
    initialConstraints.append(...) 

    // Activate your constraints once you've added them to the array (like normal) 
    NSLayoutConstraint.activate(initialConstraints) 

} 

これは役に立ちます。

+0

ビュー自体は何回ロードされますか? –

+0

申し訳ありませんが言及するのを忘れました - 私は1つのタブから別のタブに移動して元のページに戻ったときにそれが起こっていました。 –

+0

しかし、タブ間をナビゲートするとviewDidLoadがトリガーされません。 –

関連する問題