2009-04-16 11 views
0

"EXC_BAD_ACCESS"というエラーが発生するコード行があります。コード行は次のとおりです(1行にフォーマットされ、読みやすくするためにネストされたコードが削除されています)。iPhone SDK - 文字列の比較

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

実際のエラーはIF行で発生します。奇妙な点は、私がその行にブレークポイントを置くと、NSStringはsendData(NSCFStringの値が " - "で、引用符なし)と呼ばれているということです。なぜこれがエラーの原因になるのでしょうか?お知らせ下さい。

+0

私のappDelegateヘッダーファイルでsendDataプロパティを宣言していたとき、私は '保持'を使用していない - しかし、私はそれを変更し、まだエラーを取得しています。奇妙なことは、これと同じ方法で他のプロパティを使用していることです。これがエラーを生成する唯一のものです。 – Dutchie432

答えて

2

この問題を解決するには、すべてのコールバックメソッドにブレークポイントを設定する必要があります。

問題はシンプルで、コードは見つけることができないメモリにアクセスしようとしています。

コールバックが連続して呼び出されないため、そのコード行を見つけることは困難です。

  1. より多くのブレークポイントを追加し
  2. 以上のNSLog(..)を追加し、例外(throwing an exception in 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の後にコールバックだと思います。あなたが追加した場合それはEXC_BAD_ACCESSが原因となっているラインではありません


TwoViewAppAppDelegate.m

にライン157を中心にブレークポイントを試してみて、置く:

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

IF()ステートメントに、あなたはそれを見ることができます渡します。if (![sendData isEqualToString:@"-"]){...}

メソッド呼び出しからフォームを返すときにエラーが発生します。


[OK]をフォームはあなたのコメント、これは役立つかもしれない:

あなたは、彼らはすなわち、同じコンテンツを持っているならば、彼同じメモリにこれらをマッピングします@"My string"コンパイラを使用して文字列を作成する場合:

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

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

これは役に立ちますが、わかりません。多分もっと多くのコードを投稿して、私のセットアップでそれを実行することができます。


自動解放プールはiPhone上のイベント・サイクルの開始時に作成されて覚えておいてください。

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

... 

[sendData autorelease]; 

... 
+0

あなたが見たい場合は、ダウンロードのためのコードを投稿して嬉しいです。 – Dutchie432

+0

実際には、ELSEを含めるとコードはIF文をスキップしません。 – Dutchie432

+0

私のシステムでは間違いありません。奇妙な。 – rjstelling

1

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

+0

私はそれがなぜなのかわからない。 sendDataはAppDelegateのプロパティであり、割り当て解除されていません(私のこと)。また、オブジェクトが割り当て解除された場合でも、デバッガでその値が表示されますか? – Dutchie432

+0

sendDataでデータを取得または作成しますか?もしそうなら、あなたは保持を呼び出さなければならないかもしれません。 – rjstelling

+0

私は以下のようなデータを作成しています: sendData = @ " - "; – Dutchie432

0

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

"isNotEqualTo" iPhoneのOS上で、後ではなく、MAC OS Xで10.Xを担持またはれる:([CURRENTVERSIONのappversion isNotEqualTo])があれば

0

マン問題は、このライン

です。これを呼び出すと、デバイスで例外が発生します。今、私はあなたの比較のロジックをif(![appVersion isEqualToString:currentVersion])に変更すると全体のポイントを得ることができたらいいと思います。