1. ホーム
  2. objective-c

Objective-CにおけるnilとNILと, nullの違いについて

2023-10-09 03:39:54

質問

私は nil , NILnull . ググってみたら、こんなのがありました。

nil -Objective-Cのオブジェクトへのnullポインタです。

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

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

しかし、quot;Objective-C object" と "class" という用語を明確に理解することができません。

このことを説明してください。また、以下のような単語はありますか? NSNull または NSNil のどちらを使うのでしょうか?もしそうなら、それが何のためにあるのか説明してください。

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

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を表すオブジェクトのクラスです。実際には、オブジェクトは一つしかありません。 +[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にはそのようなものはありません。