0

UICollectionView の UICollectionViewCell でアニメーションを行うために SpriteKit を使用しています。シーンには、SKAction を使用してアニメーション化する 1 つのスプライトがあります。各セルの contentView には、独自の SKView/SKScene があります。メモリリークが発生しています。Xcode 6.3 の Allocations Instrument でこれを見ると、新しいセルごとに、1 MB を超える割り当てのペアがあり、1 つは「SKView set_context」に起因し、もう 1 つは allocateWCMemory GLEngine に起因することがわかります。

各 UICollectionViewCell 内では、かなり標準的なものです。他の (アニメーションとは関係のない) UIView サブビューを作成し、それらを contentView に追加しています。

奇妙でおそらく関連していることの 1 つは、UICollectionViewCell の deinit メソッドが一貫して呼び出されないことです。

考え?

アップデート:

1) これはアニメーションに直接関係しているようで、コレクション ビューにはあまり関係していないようです。コードのアニメーション部分をオフにするだけでは、メモリ リークは発生していないようです。または、少なくともそれほど多くのメモリがリークしていません。この場合、SKScene/SKView は引き続き (コレクション ビュー セルごとに) 割り当てられますが、スプライトをアニメーション化しません。また、この場合、アニメーションを無効にすると、すべての割り当て解除ブレークポイントがヒットするはずの場所 (UICollectionViewCell deinit メソッドなど) にヒットすることも付け加えておく必要があります。

2) アニメーションを再度追加しましたが、1 サイクルだけ実行します。私は繰り返しアニメーションを行っていました(同じアニメーションを繰り返し、タイマーで制御します)。一度だけ実行して停止すると、メモリリークは発生しません。したがって、問題はアニメーションの繰り返しに起因しているようです。

4

2 に答える 2

0

コードを見ないとわかりにくいですが、1 つだけ確認する必要がありますself。その場合、保持サイクルが発生する可能性があります。weakその場合はへの参照を取得する必要がありますself(Swift と Objective C では異なりますが、両方とも必要になります) 良い説明 (および適切な Swift の例) は、この投稿にあります。

于 2015-06-24T04:57:04.977 に答える