16

私は複数の方法を試しました。辞書がNULLであることはわかっています。そこで中断すると、コンソールも出力されます。しかし、if()に入れると、トリガーされません。

([myDict count] == 0) //results in crash
(myDict == NULL)
[myDict isEqual:[NSNull null]]
4

5 に答える 5

37

ダングリングポインタまたはワイルドポインタがあるようです。

Objective-Cオブジェクトを構造体へのポインタと見なすことができます。

NULLもちろん、それらを、または他のポインタと比較することもできます。

それで:

( myDict == NULL )

( myDict == [ NSNull null ] )

両方とも有効です。

最初のものは、ポインタがであるかどうかをチェックしますNULL。通常、値が0のaNULLとして定義され ます。Objective-Cオブジェクトの場合、通常はを使用することに注意してください。値が0のaとしても定義されているため、に等しくなります。これは、標準のポインターではなく、オブジェクトへのポインターを示すためのものです。void *
nilnilvoid *NULLNULL

2つ目は、のアドレスをクラスmyDictのシングルトンインスタンスと比較します。NSNullしたがって、ここでは2つのポインター値を比較しています。

したがって、すぐに再開するには:

NULL == nil == Nil == 0

そして[ NSNull null ]、有効なインスタンスは次のとおりです。

NULL != [ NSNull null ]

今これについて:

( [ myDict count ] == 0 )

ワイルドポインタがあるとクラッシュする可能性があります。

NSDictionary * myDict;

[ myDict count ];

ARCを使用しない限り、myDict変数が初期化されていないため、確実にクラッシュし、実際には何かを指している可能性があります。

ダングリングポインタがある場合にもクラッシュする可能性があります。

NSDictionary * myDict;

myDict = [ [ NSDictionary alloc ] init ];

[ myDict release ];
[ myDict count ];

次に、割り当て解除されたオブジェクトにメッセージを送信しようとします。/
へのメッセージの送信は、Objective-Cでは常に有効です。nilNULL

したがって、ディクショナリがnilであるかどうか、またはディクショナリに値がないかどうかを確認するかどうかによって異なります(有効なディクショナリインスタンスが空である可能性があるため)。

最初のケースでは、と比較してくださいnil。それ以外の場合は、カウントが0であるかどうかを確認し、インスタンスがまだ有効であることを確認します。たぶんあなたはどこかで保持を忘れただけです。

于 2012-12-19T20:28:54.640 に答える
8
if (TheDict == (NSDictionary*) [NSNull null]){

//TheDict is null
    }
else{
//TheDict is not null

}
于 2014-01-13T11:11:46.363 に答える
0

辞書にnilまたはNULLデータがあるかどうかを確認するには、すべての場合に0を返す[dictionarycount]を確認します。

于 2014-06-05T11:48:51.787 に答える
0

上記のすべては私にはうまくいきませんが、これは

if([mydict isKindOfClass:[NSNull class]])
{
   NSLog("Dic is Null")
}
else
{
   NSLog("Dic is Not Null")  
}

私のために働いた

于 2015-08-27T11:32:57.260 に答える
0
if([NSNull null] != [serverResponseObject objectForKey:@"Your_Key"])
{
//Success
}
于 2018-08-10T13:36:23.837 に答える