2017-06-13 4 views
2

一般的に私は、ブロックが強く保持されていないので、UIView.animate()を使用するときに自己を弱くする必要はないが、遅延のために次のビットのコードで弱を使用するための引数があることを認識しています?なぜ誰かがそこにいると言うだろうか?遅延があり、コレクションビューでバッチ更新を実行すると、UIView.animateで自己が弱くなるはずですか?

UIView.animate(withDuration: 0.1, animations: { 
    self.performAction() 
} 

次の例では、なぜ弱い自己を使用する必要がありますか弱い自己を使用する必要はありませんか?

collectionView.performBatchUpdates({ 
    self.collectionView.reloadData() 
    ... 
}) 

答えて

2

背景:

ブロック/クロージャがヒープメモリ内の参照カウントのオブジェクト以外の何物でもありません。ブロックを作成し、ブロック/クロージャへの強い参照を保持すると、ブロックの参照カウントは1だけインクリメントされます。

明らかに、ブロックがメモリから実行された後でも解放されないことを意味しますブロックへの参照を強く保持しているクラスは、強い保持を解除します。

これを覚えておいてください。ブロックに強い自己を渡すと、ブロックが実行を終了するまでブロック内で使用される変数が保持されるので(関数とブロックの主な相違点であるコンテキストキャプチャ)、selfブロック自体が解放されるまで解放されない。

デッドロック:)自己がブロックオブジェクトとブロックオブジェクトへの強い参照を保持しているため、インターンはselfへの強い参照を保持しています。今、お互いが解放されてお互いを解放することを決して待つことはありません。あなたの質問へ

回答:あなたは強くUIView.animateブロックの参照を保持していない場合は指摘したように、あなたが弱い自己を渡すため

は、何の説得力のある理由が存在しないのでcollectionViewの場合ですバッチ更新。

あなたの場合

collectionView.performBatchUpdates({ 
    self.collection.reloadData() 
    ... 
}) 

私はそのIBOutletあなたがその弱いオブジェクトとして宣言されていることを観察している必要がある場合、コレクションはcollectionViewであると信じています。

collectionView.performBatchUpdates({ 
    self.collection?.reloadData() 
    ... 
}) 

はそれが

+0

をホープのようなので、あなたのコードは、より多くのを見ている必要がありますあなたの答えをいただき、ありがとうございます。私は今、私の疑問は、なぜ誰かがこのような状況で強く捕まえるべきではないと言っているのだろうと思うのですか?遅延/更新がしばらくの間、ユーザーが別の場所に移動し、親(コントローラ)の割り当てが解除され、その後何が起こるかといった状況がありますか?または、自己が弱くなければならないと言うのは間違っていますか? – jeh

+0

ブロックにセルフが渡された場合、戻るボタンをタップして親VCに移動しても、セルフアロケーションは解除されません。これを確認するには、deinitを書いてください。ブロック終了の完了後にのみ呼び出されます。だから今あなたが離れて移動するとどうなるのか知っています:)強く捉えれば、自己はゼロにならないでしょう。しかし、IBOutletとしてドラッグされたUIコンポーネントは、デフォルトでは弱いです。だからあなたのブロックがそれらの要素にアクセスするまでには、定義によって彼らは決して強く保持されなかったから解放されたかもしれません –

+0

一方、自己によって強く保持されているものはすべてブロック内で利用可能になります。そのため、私はコレクションビューに注意深くアクセスしていたスニペットを追加しました。そして、使用しないでください!:)最後に、ブロックの実行が永久にかかっているか、または何らかの条件に基づいて決して実行できないオプションのブロックがある場合、ブロックの実行が完了するまで自己は解放されないため、弱い自己を渡す唯一のシナリオがあります。そのようなシナリオでは、自己は自殺するだろう:) –

関連する問題