2011-05-11 13 views
1

web-serviceによって返されたフィールドと、文字列trueまたはfalseのいずれかのみを比較しようとします(YES、STRINGでブール値ではありません)。このような別の文字列で:withOptions文字列は「真」の文字列が含まれている場合[NSNull isEqualToString:]:インスタンスに送信された認識できないセレクタ

if ([withOptions isEqualToString:@"true"]) { 
       [email protected]"with"; 
      }else { 
       [email protected]"without"; 
      } 

ので、すべてがOKですが、それが「偽」の文字列が含まれているとき、私はログにこの例外が発生しました:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x2984d68' 

私はかなり確信していますいずれの場合も、withOptionsには文字列値( "true"または "false"のいずれか)が含まれ、NULLを含んでいません。

+2

あなたは 'withOptions'は常に文字列であるように確認するべきではありません。 'withOptions'は、このエラーがスローされたときに' NSNull'のインスタンスです。考えられる理由は2つあります: '+ [NSNull null]'を返すメソッドから 'withOptions'を取得しています。見つからないことを示すために、またはメモリを壊してすべてのベットがオフになっていることを示します。 –

+0

こんにちは、私にあなたの2番目の理由を教えていただけますか? thx – Luca

+0

これは、オブジェクトをどこかでオーバーリリースし、新しいオブジェクトが同じアドレス(異なるタイプのオブジェクト)に割り当てられたことを意味します。しかし、+ + nullはアプリライフサイクルの早い段階で割り当てられたシングルトンを返しますので、これは起こり得ません。バリーの第一の理由は、その可能性が高いことです。 – bbum

答えて

3

私はすべてのケースで、 withOptionsは、文字列値 が含まれていることをかなり確信している(「true」または「false」)と、それはNULLが含まれません 。

明らかに、その仮定は間違っています。 :)

その if()文の前の行に

NSLog(@"%@ - %@", withOptions, [withOptions class]);

ないことNSNullNULLは同じものではありません追加します。 NSNullは、値としてnilを受け入れないコンテナ(およびその他のもの)のシングルトンインスタンスが「値なし」を表すクラスです。

このクラッシュが発生すると、withOptionsは、NSNullというインスタンスを参照しています。

+0

こんにちは、私はすでにそれについて考えて、私は文字列 'withOptions'のクラスをテストし、ログには' NSCFString'があるので、私はバリーの第二の理由について考えるでしょう:) – Luca

+0

'withOptions' 'if()'ステートメントの前の行に 'NSCFString'型があり、' NSNull'になったので 'if()'ステートメントでクラッシュします。それでもメモリ破損の可能性がありますが、結論として、 'ifOptions'は' if() 'ステートメントが実際のクラッシュが発生した場所であれば' NSNull'への参照を含んでいます。 – bbum

+0

こんにちは、私はエラーをトラッキングしようとすると、問題は、isEqual関数から来ていないことがわかりました、私の新しい投稿、ここで私の問題を説明してください、事前にthxを参照してください:http://stackoverflow.com/questions/ 5970981/exception-nsnull-isequaltostring-unrecognized-selector-i-click-on-callou – Luca

0

これはわかりやすいコードです。あなたができる

if ([[info objectForKey:@"address"] isKindOfClass:[NSNull class]]) { 
      dto.address = @"Unknown"; 
} 
0

あなたは安全なcomparaisonをしたいと、それは、例えばnullになる可能性があるため、あなたの、あなたの「withOptionは」文字列が含まれている100%でない場合(noオプションが与えられなかった場合)この:あなたもcomparaisonを短縮することができます

if ([@"true" isEqualToString:withAnnotation]) { 
    [email protected]"with"; 
}else { 
    [email protected]"without"; 
} 

注:

annotation.stationLavage=[@"true" isEqualToString:withAnnotation][email protected]"with":@"without"; 
関連する問題