17

null実際、ここでの私の質問は次のとおりnilです。同等かどうか。

私には例がありますが、等しくないのに等しいと混乱します。

NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
id aValue = [arrayWithNull objectAtIndex:0];

if (aValue == nil) {
    NSLog(@"equals nil");
} else if (aValue == [NSNull null]) {
    NSLog(@"equals NSNull instance");
    if ([aValue isEqual:nil]) {
        NSLog(@"isEqual:nil");
    }
}

ここでは、上記の場合、nullnilが等しくないことを示し、「NSNullインスタンスに等しい」と表示されます。

NSString *str=NULL;
id str1=nil;
if(str1 == str)
{
   printf("\n IS EQUAL........");

}
else
{
    printf("\n NOT EQUAL........");
}

そして2番目のケースでは、両方が等しいことを示し、「ISEQUAL」と表示されます。

どなたでもご協力いただければ幸いです。

ありがとう、モニッシュ。

4

6 に答える 6

22

nilNULLは本質的に同じで、 のnilようなものですが(NSObject *)0NULLのようなもの(void *)0です。ただし、どちらも整数値ゼロのポインターです。エラーを発生させずにメッセージを送信できnilます。

NSNullNULL(またはnil、もちろん) は別のものです。オブジェクトをコンテナ クラスに追加することはできないためNSNull、ヘルパーとして使用するだけです。したがって、代わりに を使用し、配列要素がであるかどうかではなく、 であるかどうかを確認する必要があります( と等しくなることはありません)。emptyNSArraynil[NSNull null]NSNullnilnil

于 2010-03-17T11:09:41.707 に答える
7

http://www.iphonedevsdk.com/forum/iphone-sdk-development/34826-nil-vs-null.htmlから

nilNULL100%交換可能です。

から:

  • NULLCスタイルのメモリポインタ用です。
  • nilObjective-Cオブジェクト用です。
  • NilObjective-Cクラス用です。

Objective-Cコードを作成するときは常に、Cコードをnil 作成するときは、を使用してください。NULL

しかし、最終的にはそれらはすべて同じものとして定義されます-(void *)0、私は思います-したがって、実際にはそれは実際には重要ではありません。

于 2010-07-03T04:16:08.023 に答える
2

概念は同じですが、メッセージ (call メソッド) を nil に送信することが有効であるという違いがあります。

NSNull は、NULL または nil 値を受け入れない配列または辞書に使用できる実数 (シングルトン) クラスです。

于 2010-03-17T11:07:54.253 に答える
2

それらの最大の違い:NSNULLオブジェクトにメッセージを送信するとおそらくクラッシュが発生しますが、 にメッセージを送信するのはクールですnil。たとえば、キー パスを使用して配列を取得する場合は、次のようになります。

NSArray *departmentNames = [departments valueForKey:@"name"];

次に、 がNSNULLである任意の部門のオブジェクトが作成nameされますnil。したがって、これによりクラッシュが発生します。

for (NSString *name in departmentNames)
    NSLog(@"%@", [name lowercaseString]);

不明なセレクター( ) を に送信したためnameです。NSNulllowercaseStringNSNull

教訓:NSNull要素にメッセージを送信する前に、配列内のオブジェクトを確認してください。

for (NSString *name in departmentNames)
    if (name != [NSNull null])
         NSLog(@"%@", [name lowercaseString]);
于 2012-01-30T20:12:45.900 に答える
1

[NSNull null] を比較対象のオブジェクト型に型キャストしてください。

NSArray list;
if(list==(NSArray *)[NSNull null])
    // do something

そうしないと、「個別のポインター型の比較('type *' と 'NSNull *')」という警告メッセージが表示されます。

于 2012-10-09T14:56:14.300 に答える
1

いいえ、NSNullnilは同じではありません。どちらも価値の欠如を表しており、同じように扱いたいと思うかもしれませんが、それでも同等ではありません。

NSNullたとえば、null 値を持つデータベースからデータを読み取る場合、オブジェクト インスタンスは null 値を表します。

値は null ポインターです。nilつまり、どのオブジェクト インスタンスも指していません。

NSNull2 番目のコードには、インスタンスがありません。NSStringnull ポインターを含むポインターはインスタンスではなく、単なるNSNullnull ポインターです。あるヌルポインターを別のヌルポインターと比較していますが、それらはもちろん等しいです。

于 2010-03-17T11:12:34.320 に答える