0

iPhone SDK 2.2 で開発していたアプリがあり、最近それをビルドして 3.0 シミュレーターで起動しました。ベース SDK は引き続き 2.2 に設定されています。問題を回避できると考えました。代わりに私は得る

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000a1b1c1f3
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x92f4b688 objc_msgSend + 24
1   Foundation                      0x305085bd -[NSCFString isEqualToString:] + 61
2   HappyApp                        0x00002c27 -[CombinationsTableViewController loadData] + 220 (CombinationsTableViewController.m:64)

クラッシュは非常に単純な行で発生していtotalます。UITextField

if (![total.text isEqualToString:@""] ) {

誰かがこれに遭遇しましたか?スレッドの競合の問題か、アプリ全体が正しくコンパイルされていないように感じます。2.2.1 シミュレーターで動作します。これが OS 3.0 で 2.2 アプリをテストする方法ではないことが判明した場合、そのドロップダウン ボックスを切り替える以外に何をすべきでしょうか?

更新: Andrew Pouliot は、これがリリースされたリファレンスの問題であるという点で正しかったです。デバッガーが 1 行オフを指していたので、間違ったヒントが得られました。犯人は、実際には次の最初の行でした。

if(!([total.text isEqual:totalTextCache]
  && [divisions.text isEqual:divisionsTextCache])) {
  //Loads the data for the table only if the values were actually changed
  totalTextCache = total.text; //ditto for divisions
}

これらの行は の唯一の使用であり、 を変更totalTextCacheすると無効になりtotal.textました。これは 2.2.1 sim で問題を引き起こすことはありませんでした。これはおそらく、total.text値が変更されたときに old がランタイムによって解放されなかったためです。しかし、このコードは間違っていました。isEqual が行っていると思っていたことを正確に実行するように変更して修正しました。

if(!(total.text==totalTextCache && divisions.text==divisionsTextCache))

私は実際には s をコピーしたくなかったのでNSString、それらが変更されたかどうかを確認するだけでした (したがって、参照が変更されたはずです。これは機能します。古い参照がまだ残っている可能性があるため、2.2.1 ランタイムでは悪いコードが正常に実行されました)。によってチェックおよび比較されるハッシュ プロパティisEqualです。

4

1 に答える 1

1

3.0 SDK をインストールしたときに 2.0 ツールがなくなったので、これが当てはまるかどうかはわかりませんが、シミュレーター ビルドが将来のランタイムとバイナリ互換になるように設計されているとは思いません。

ただし、問題はコードにある可能性があります。もしそうなら、「スレッドの競合」ではなく、メモリ管理の問題があると言えます。UIKit のメイン スレッドですべてが発生します (スレッド セーフではありません)。

合計変数を設定した場所を確認してください。このメソッドを実行するときには、すでにリリースされている可能性があります。あなたのretainCountが賢明であることを確認してください。

3.0 用にビルドすると同じエラーが発生しますか?

于 2009-06-19T08:36:21.570 に答える