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
です。