nil
、NIL
、およびnull
の違いを知りたい。私はグーグルで探してこれを見つけました:
nil
-> Objective-Cオブジェクトへのnullポインタ
NIL
-> Objective-CクラスへのNULLポインター
null
->プリミティブ型へのNULLポインターまたはデータの欠如
しかし、「Objective-Cオブジェクト」および「クラス」という用語を明確に理解することはできません。
これを説明してください。また、Objective-CにはNSNull
やNSNil
のようなWordがありますか?その場合は、その目的を説明してください。
nil
は、Objective-CオブジェクトのリテラルNULL値であり、抽象型id
または@interface
を介して宣言された任意のObjective-C型に対応します。例えば:
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
はリテラルのNULL値であるため、つまり、オブジェクトではないため、nil
とは異なります。一方、NSNull
の単一のインスタンスは適切なオブジェクトです。
NSNull
は、nil
値を格納できないため、Foundationコレクションでよく使用されます。辞書の場合、-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。
わかりませんが、nil
はid
の代わりにのみ使用すべきだと思います。JavaとC++プログラマーはpointer
と考えるobject
に。非オブジェクトポインターにはNULL
を使用します。
nil
は通常、Objective-Cオブジェクトタイプに使用され、NULL
はcスタイルポインターに使用されます。
Nil、Nullおよびnilは以下で使用されます
1> Objective C Classの場合はなし
2> Objective Cオブジェクトの場合はnil
3> Cポインターの場合はヌル
例:
1>クラスA = Nil;
2> NSString strName = nil;
3> char * pointerChar = NULL;
クラスMyClass
があり、そのインスタンスをnull値(Javaのnil
と同じ)に初期化する場合は、慣例によりnull
が使用されるとします。
MyClass *obj = nil;
そしてプリミティブポインターをnull値に初期化する場合(cと同じ)を使用します
int *ptr = NULL;
そしてnull値へのClass
参照(Javaのnull
と同じ)に初期化する場合は、
Class classRefOfMyClass = Nil;
それは単なる慣習であり、そうでなければNilまたはnilは同じ意味を持ち、おそらくNULL、nilまたはNilはすべて同じです。
これらはobjc.h
ファイルでの定義です
#ifndef Nil
# if __has_feature(cxx_nullptr)
# define Nil nullptr
# else
# define Nil __DARWIN_NULL
# endif
#endif
#ifndef nil
# if __has_feature(cxx_nullptr)
# define nil nullptr
# else
# define nil __DARWIN_NULL
# endif
#endif
stddef.h
#define NULL ((void*)0)
__DARWIN_NULL
の_types.h
の定義
#define __DARWIN_NULL ((void *)0)
したがって、論理的に違いはありません。ここでの主なアイデアは、C
またはObjective-C
から0
へのポインターを初期化することです。 C
の知識がある場合は、割り当てることができます
int *ptr = 0;
0
をポインターに型キャストしません。 0
を型キャストしてポインターに割り当てる必要はないので。
0
であり、他には何もありません。nil、NILおよびnull。要件に依存します。
NSNull
NSArray
やNSDictionary
などのコレクションは、nil値を含むことができません。
NSMutableDictionary *MymutableDictionary = [NSMutableDictionary dictionary];
MymutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for "someKey"
NSLog(@"Keys: %@", [mutableDictionary allKeys]);
nil
オブジェクトが他のオブジェクトを指すポインタはすべてnilで始まるため、たとえば、initメソッドでself。(association)= nilを設定する必要はありません。
C++などの他の言語では、これによりプログラムがクラッシュしますが、Objective-Cでは、nilでメソッドを呼び出すとゼロ値が返されます。
if (name != nil)
{
........
}
objective-Cオブジェクトのnil(id)0リテラルnull値
Objective-CクラスのNil(Class)0リテラルnull値