0

「EXC_BAD_ACCESS」エラーの原因となるコード行があります。コード行は次のとおりです (読みやすくするために、1 行にフォーマットされ、ネストされたコードは削除されています)。

if (![sendData isEqualToString:@"-"]){ ... }

実際のエラーは IF ラインで発生します。奇妙なことは、その行にブレークポイントを置くと、NSString が sendData を呼び出すことです (引用符なしで "-" の値を持つ NSCFString として表示されます)。なぜこれがエラーを引き起こすのでしょうか?

4

3 に答える 3

2

この問題をキャッチするには、すべてのコールバック メソッドにブレーク ポイントを配置する必要があります。

問題は単純です。コードが見つからないメモリにアクセスしようとしています。

コールバックが順番に呼び出されないため、そのコード行を見つけるのは困難です。

  1. さらにブレークポイントを追加
  2. さらにNSLogを追加(..)
  3. 例外をキャッチすることを検討してください ( objective-c/cocoa で例外をスローするを参照)

コンソールからの出力:

Attaching to program: `/Users/rjstelling/Library/Application Support/iPhone Simulator/User/Applications/C04A40BB-1D98-402E-BBEF-37E6FB860089/TwoViewApp.app/TwoViewApp', process 24032.
Re-enabling shared library breakpoint 1
2009-04-16 16:16:45.830 TwoViewApp[24032:20b] stream event 1
2009-04-16 16:16:45.831 TwoViewApp[24032:20b] on input stream
2009-04-16 16:16:45.831 TwoViewApp[24032:20b] stream event 1
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] on output stream
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] stream event 4
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] on output stream
2009-04-16 16:16:45.833 TwoViewApp[24032:20b] stream has space open
(gdb) continue
2009-04-16 16:17:06.405 TwoViewApp[24032:20b] We made it - ok!
2009-04-16 16:17:06.406 TwoViewApp[24032:20b] stream event 2
2009-04-16 16:17:06.406 TwoViewApp[24032:20b] on input stream
2009-04-16 16:17:06.407 TwoViewApp[24032:20b] Processing: +OK CONN PinkNotes® Plus Master v5.00.26 Beta (v4 compatible)
:tPNPStr
2009-04-16 16:17:06.407 TwoViewApp[24032:20b] SendData= USER (null):tPNPStr
Current language:  auto; currently objective-c
Program received signal:  “EXC_BAD_ACCESS”.
(gdb) 

ProcessData問題は、私が思うコールバックのどこかで発生します。TwoViewAppAppDelegate.m の 157 行目付近にブレーク ポイントを配置してみてください。


EXC_BAD_ACCESS追加した場合、原因となっているのはその行ではありません。

else
{
    NSLog(@"We made it - ok!");
}

if() ステートメントには、if ( ![sendData isEqualToString:@"-"] ){...}

メソッド呼び出しから戻ったときにエラーが発生します。


わかりました、あなたのコメントはこれが役立つかもしれません:

コンパイラを使用して文字列を作成すると、内容が同じ場合@"My string"、コンパイラはこれらを同じメモリにマップします。

NSString *var1 = @"string1";
NSString *anotherstring = @"string1";
NSString *morestringivars = @"string1";

すべて同じメモリ空間を指します。

これは役立つかもしれませんが、方法がわかりませんか?私のセットアップで実行できるように、もっと多くのコードを投稿できるかもしれません。


iPhone でのイベント サイクルの開始時に、自動リリース プールが作成されることに注意してください。

したがって、sendData を ivar に割り当てたらすぐに autorelease を呼び出すことをお勧めします。

...

[sendData autorelease];

...
于 2009-04-16T14:19:45.687 に答える
1

メモリの割り当てが解除されたオブジェクトにメッセージを送信しようとしているようです。メモリ管理プログラミング ガイド for Cocoaで説明されている適切なメモリ管理手法に従っていることを確認してください。おそらく修正は、[sendData retain]割り当てが解除される前のある時点で a を追加することですが、それが機能する理由を理解するには、前述のガイドを読む必要があります。

于 2009-04-16T14:07:52.517 に答える
0

利用できないオブジェクトにメッセージを送信するときのクラッシュを防ぐために、リリース後にオブジェクトを nil に設定します。

于 2009-04-16T21:27:19.687 に答える