質問

このようなエラーがありました - *猛攻撃の例外によるアプリの終了「nsinvalidargumentexception」、理由:** - [nscfdictionary initwithobjects:forkeys:count:]:objects [0](key:searched)にnil値を挿入しようとする

次に、以下のコードを試しました

    if (Obj == (id)[NSNull null])  //Obj is an id 
{
    NSLog(@" Obj is (id)[NSNull null]");    
}
else if (Obj == nil)
{
    NSLog(@"Obj is nil");   
} 
else if (Obj == NULL)
{
    NSLog(@"Obj is NULL");  
} 
else
{
    NSLog(@"Obj is something else");
}

searchedDict = [NSDictionary dictionaryWithObject:Obj forKey:@"searched"];

そして、「OBJはnil」としてnslogメッセージを受け取りました。

しかし、OBJがnsStringであり、nil値のためにアプリが終了したときに上記のコードを使用したとき、nslogメッセージを「obj is(id)[nsnull null]」として受け取りました。

nil、null、[nsnull nil]の違いは何ですか?

異なる種類のヌル値はありますか?はいの場合、これらのヌル値をよく確認する方法?

ありがとう :-)

役に立ちましたか?

解決

NULL ポインターに与えられた元のCスタイルの値は、明示的なアドレスを指しないとみなされるとみなされます。それは通常、「絶えず」または センチネルの価値.

char * oldstring = NULL;

nil OBJ-Cオブジェクト参照に適用されるのと同じもののObjective-Cバージョンです。

NSString * str = nil;
id foo = nil;

どちらも値ゼロに等しいと定義されていますが、あなたは できる それらを交換可能に使用すると、前者は主に従来のポインターのためにOBJ-C内で見られます(設定など void * nullへのコンテキストポインター)および nil すべてのOBJ-Cオブジェクト参照に使用されます。

違いは存在します。OBJ-Cの構文はたまたまCの上に乗っていますが、言語の設計は高レベルであり、そのオブジェクトIDは 概念的には同じではありません 単に「ポインター」として。したがって、彼らのための特別なセンチネルの作成。

[NSNull null] オブジェクトです それは意図されています 「非価値」値が望まれているが実際の非常に特定の場合(コレクションへの挿入など)に使用すること nil 許可されておらず、オブジェクトを使用する必要があります。

ご了承ください nilNSNull 非常に同様にstringify: nil Stringifies as (null), 、 と NSNull なので <null>.

他のヒント

[NSNull null] のラッパーです nil コレクションに挿入したい値は、それがあなたが望むものであれば。

nsnull クラス参照。

オブジェクト参照が前に確認することもできます nil 単に ==.

また nil と定義されている : #define nil NULL cに相当する客観的なc NULL.

nilはオブジェクトポインター用です

ヌルは非ポインター用です

nsnull null]は、nil値が許可されていない場合に使用する「nil」を表すオブジェクトです(ヴィンスが指摘したように、コレクションなどのnsarrayやnsdictionaryのように)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top