0

LorenBrichterのFastTableViewサンプルに基づいて、コアグラフィックを使用してカスタムUITableViewCellを描画しています。

カスタムセルクラスでいくつかのiVarを使用しています。これは、強力な参照(したがって、ARC)を使用してアトミック(マルチスレッドセーフ)として作成しています。

tableViewのスクロールが速すぎると、問題が発生します。- (void)drawContentView:(CGRect)rectカスタム描画を実行するためにサブクラス化しているメソッドでランダムにクラッシュします。

問題は、カスタムセルクラスで使用しているiVarが解放され、メモリが他のオブジェクトによって所有されるようになったことです。これにより、もちろんクラッシュが発生します。

描画コード全体に@synchronizedディレクティブを使用して、描画コードにミューテックスロックを強制しようとしましたが、問題は解決しませんでした。

他の誰かがこの問題に直面し、問題の解決策を知っていますか?

4

1 に答える 1

2

Atomicは、一般的に「マルチスレッドセーフ」を意味するわけではありません。これは、ゲッターを使用すると、追加の保持/自動リリースのペアが追加され(実行ループ中に消えることがないように)、セッターと@同期されるため、次のことができることを意味します。設定と衝突の場合、オブジェクトの半分を取得しません。これはすべて、ゲッターとセッターを使用する場合にのみ当てはまります。ivarに直接アクセスしないでください。もしそうなら、アトミックは何の意味もありません。

メインスレッド以外のスレッドでメインUIKitコンテキストを変更している可能性もあります。あなたはこれを行うことはできません。メインのUIKitコンテキスト(に渡されるコンテキストdrawRect:)は、メインスレッドでのみ有効です。

于 2012-06-07T19:04:40.027 に答える