ARC とブロックに問題がありましたが、問題は解決しました。残念ながら、私は正確に何が起こっているのかわかりません。私の状況についてもっと知りたいと思っています.
もともと、これを行うコードがありました
for(__block id<Foo> object in objects) {
foo download:someParm
success:^{
object.state = StateNewState;
}
];
}
これにより、保持の不均衡が発生しました。オブジェクトがアクセスされ、すでに割り当てが解除されていると言われると、クラッシュが発生します。「copy」属性を実装して使用するクラスを作成し、ダウンロード関数の success パラメータに渡されたブロックを保存する successBlock プロパティを作成しました。このコードを次のように置き換えました
for(id<Foo> object in objects) {
foo download:someParm
success:^(id<Foo> successObject){
successObject.state = StateNewState;
}
];
}
オブジェクトの割り当て解除エラーはなくなりましたが、リークしていないかどうかを確認するためにインストゥルメントをまだ実行していません。__block を使用するとオブジェクトが何度も解放されてしまい、その理由がわかりません。この問題の原因については調査を続けますが、残りの皆さんが考えるには興味深い問題だと思いました。
objects 配列は、この記事の前半で書き留めたコードの次の行で作成された、自動解放された配列であったことに注意してください。それは問題ではないと思いますが、私はそこを通り抜けると思いました。この記事に掲載したコードは正確なコードではありません。これは仕事で使用していて、そこには毛羽立ちがたくさんあるからです。しかし、for ループで作成される他のオブジェクトはありません。
アプリがクラッシュすると、ダウンロードが実行され、後でコールバックが実行されます。ちなみに、私は ASIHttp を使用しています。もう一度ダウンロードしようとすると、オブジェクトの割り当てが解除され、デリゲートが無効になっているため、実行され、コールバックが呼び出されません。この後、オブジェクトへのポインターを含む辞書によってオブジェクトにアクセスすると、クラッシュします。