NSOperations
Web API へのサービス呼び出しを管理するために使用するアプリがあります (呼び出しは、Jon Wight の touchcode の CURLOperation に基づいています)。
マップ ビューの中心が大幅に変化したときに、マップの位置をダウンロードする特定の呼び出しがあります。これらはすぐにスタックする可能性があるため、マップを移動すると、古い操作を積極的にキャンセルしようとします. 4.0でうまく機能します。
ただし、3.1 では、特定のケースでは、オペレーション キューがキャンセルされた (および解放された) オペレーションを保持し、キューにあるはずの場所に到達したときにクラッシュを引き起こすようです。
これがイラストです。
キュー内の比較的重いサービス コールから始めます。
MyLongRunningOp 0x1
ユーザーがマップに移動します。キューは次のようになります。
MyLongRunningOp 0x1
MyMapOp 0x2
マップを移動すると、MyMapOp 0x2 がキャンセルされ、MyMapOp 0x3 が追加されます。
MyLongRunningOp 0x1
MyMapOp 0x3
MyMapOp 0x2
キューから削除されたため、リリースされました。これMyLongRunningOp 0x1
で終了。isFinished キーを on に設定するための KVO コールバックでMyLongRunningOp
は、操作キューが通知を処理し、MyMapOp 0x2
いくつかの に追加しようとしていることがわかりますNSArray
。当然、NSZombies
有効にすると、
[MyMapOp retain]: message sent to deallocated instance 0x2
はNSOperationQueue
キャンセル/解放された操作へのポインタに何らかの形でぶら下がっており、前の操作が終了した後にそれをアクティブにしようとしているようです。
4.0 でこの動作を再現できなかったので、3.1 のバグだと思います。
私が知る限り、唯一の回避策は操作をキャンセルしないことです。これにより、ネットワークが不安定になったときに次善のエクスペリエンスが得られます。
他の誰かがこれを経験しましたか?何か案は?