2012-04-10 12 views
1

ネットワークタスクにGCDを使用しています。私は、サーバーからデータをロードしているテーブルビューコントローラを持っていますが、このコントローラを離れて別のビューコントローラを起動すると、アプリケーションがクラッシュします。私はこの問題の解決策を見つけることができません。サーブからの応答は、テーブルビューのデータソースであるNSArrayです。私は応答を取得するときにコントローラにデータソースプロパティを設定します。私はsetterをオーバーライドし、現在のビューがテーブルビューであるかどうかをチェックし、テーブルがリロードされているかどうかを確認します。私はこれに間違って近づいていますか?エラーが場所の多種多様であることができようにネットワークタスク用GCD iOS

おかげ

+0

この操作に関するコードを記入してください。クラッシュのデバッグ出力とは何ですか?クラッシュはどこで起こりますか? –

答えて

0

が鳴ります。私のアドバイスは、問題を徐々に小さくすることです。これは必ずしも迅速かつ容易なわけではありません。しかし、問題を見つけることができます(そして、その過程で多くを学ぶ)。

最初の手順として、ネットワークからのデータをローカルデータに置き換えてみます。それでも問題が解決しない場合は、おそらくネットワークレスポンスを処理するコードを除外することができます。

他の方法もあります。リクエストで返されたデータを調べるだけです。それをアプリに渡さないでください。おそらく、レスポンスで空の、不適切な形式のデータなどが気付くでしょう。

注:サーバーがNSArrayを返すとは思われません。区別がはっきりしていることを確認してください(おそらく、jsonのフォーマットされたデータを受け取り、それを解析しています)。

+0

申し訳ありませんが、ブロックがNSArrayを返すことを除外しました。私は実際に問題を追跡しました。クラッシュはobjc_msgSend()エラーです。だから、私のコントローラーが解放されていて、私は解放されたオブジェクトのメソッドを呼び出しています。コントローラーが現在画面に表示されているかどうかを確認し、それがメソッドであるかどうかを確認します。しかし、コントローラが現在画面に表示されていない場合でも、このメソッドはまだ呼び出されています。だから私はビューが更新されないように別の方法を見つける必要があります。何かアドバイス? – ish13

+0

一般に、リリースされたオブジェクトを解放した後にオブジェクトをnilに設定することで、解放されたオブジェクトのメソッドを呼び出すことを防ぐことができます。メソッドを呼び出す前にオブジェクトが存在するかどうかを確認します: 'if(myObject)[myObject someMethod]; ' – SundayMonday

+0

それは既にこのように設定されていますが、まだメソッドを呼び出すことです。コントローラーはまだメモリに入っていて、その後はいつか解放されるはずです。その他のアドバイスは?ありがとう – ish13