2012-02-08 31 views
1

私は、iPhoneアプリケーション内のすべてのAPIデータ呼び出しを処理する "Folio APIWrapperv2"と呼ばれるシングルトンラッパークラスを持っています。ASIHTTPRequest内のスレッディング

このクラスは、サーバーからJSONを取得するためにASIHTTPRequestを実装しています。 ASIHTTPRequestが終了すると、requestFinished:が呼び出されます。この方法では、データの追加処理が完了してから数秒かかる場合があります。それはメジャーではありませんが、それはブロッキングコールのように、アプリを少し遅くします。これを修正するために、GCDを使用して新しいスレッドを作成します。この機能は、ラインでASIHTTPRequestの「handleBytesAvailable」方法で呼び出されている

[FolioAPIWrapperv2 respondsToSelector:]: message sent to deallocated instance 0x245050 

if ([[self delegate] respondsToSelector:[self didReceiveDataSelector]]) { 

は、私は何が起こっているのかわからないんだけど、このスレッドが実行されるときしかし、私は次のエラーを取得しますここに。 FolioAPIWrapperv2はシングルトンクラスなので、割り当てを解除しないでください。私はオンラインで検索してみて、人々がスレッドで持っていた他の問題を知り、適切な解決策を見つけることができませんでした。誰にもアイデアはありますか?

答えて

0

デリゲートをクラスのインスタンスまたはクラス自体に設定していますか?デリゲートは、クラスのインスタンスでなければなりません。

あなたが出力を取得している場合はそれ以外の場合は、:

[FolioAPIWrapperv2 respondsToSelector:]: message sent to deallocated instance 0x245050 

そして、割り当てを解除すべきではありませんあなたのクラスが割り当て解除になっている可能性が高いようです。あなたのシングルトンの初期化/のdeallocでの自己のため

NSLog("set delegate to %p", request.delegate); 

と同様の伐採:

いずれかの方法で、これにアプローチするために、少なくとも1つの方法は、あなたが要求を作成するときに、例えば、いくつかのデバッグを追加することです。

+0

さて、私はいくつかのテストを行い、スレッドがシングルトンのメソッドを呼び出すと、割り当てが解除されることを発見しました。スレッドがシングルトン内のメソッドを呼び出さない場合、それは機能します。ここで何が起こっているのか知っていますか? –

+0

@MichaelD。さっぱり分からない! deallocにブレークポイントを貼り付けて、ブレークポイントのリリース/ autoreleaseに失敗した場合は、割り当て解除を行っているコードが表示されます。 – JosephH