1. ホーム
  2. objective-c

[解決済み] Objective-Cのnil、NIL、nullの違いについて

2022-02-19 20:25:58

質問

との違いを知りたい。 nil , NILnull . ググってみたら、こんなのがありました。

nil -Objective-CオブジェクトへのNULLポインタ

NIL -Objective-CクラスへのNULLポインタ

null -> プリミティブ型へのヌルポインタ、またはデータがない場合

しかし、Objective-Cのオブジェクトとクラスという用語がよく理解できないのですが。

解説をお願いします。また、以下のような単語はありますか? NSNull または NSNil Objective-Cでは?もしそうなら、それは何のためにあるのか説明してください。

どのように解決するのですか?

nil は、Objective-CオブジェクトのリテラルNULL値で、抽象的な型である id で宣言されたObjective-Cの型、または @interface . 例えば

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;

if (anotherObject == nil) // do something

Nil は、Objective-C のクラスのリテラル NULL 値で Class . ほとんどのコードはクラスを参照するための変数を必要としないので、その使用は一般的ではありません。一例を挙げます。

Class someClass = Nil;
Class anotherClass = [NSString class];

NULL は、任意のCポインタに対するリテラルなNULL値です。例えば

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

NSNull は、NULLを表すオブジェクトのクラスです。実際には、オブジェクトは1つしかありません。 +[NSNull null] . とは異なります。 nil なぜなら nil はリテラルなNULL値、つまりオブジェクトではありません。の単一のインスタンスは NSNull 一方、これは適切なオブジェクトである。

NSNull を格納することができないため、Foundationコレクションでよく使用されます。 nil の値です。ディクショナリーの場合 -objectForKey:nil は、指定されたキーに対応するオブジェクトが辞書にないこと、つまり、そのキーが辞書に追加されていないことを示します。あるキーがあるがまだ値がないことを明示的に示したい場合は [NSNull null] .

たとえば、次のようにすると例外が発生します。 nil の値を指定します。

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:nil forKey:@"someKey"];

一方、次のようなコードは有効です。 [NSNull null] は非 nil オブジェクトを作成します。

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

Foundation コレクションのイニシャライザーが nil をオブジェクトのリストの終わりを示すマーカーとして使用することで、リストの要素数を指定する必要がありません。このようなことが起こるのは nil は、Foundationコレクションに格納することができません。例えば

NSArray *array = [NSArray arrayWithObjects:@"one", @"two", nil];

については NIL または NSNil しかし、Objective-CやApple Foundationにはそのようなものはありません。