web-dev-qa-db-ja.com

Objective-Cではnil、NIL、nullの違い

nilNIL、およびnullの違いを知りたい。私はグーグルで探してこれを見つけました:

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

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

null->プリミティブ型へのNULLポインターまたはデータの欠如

しかし、「Objective-Cオブジェクト」および「クラス」という用語を明確に理解することはできません。

これを説明してください。また、Objective-CにはNSNullNSNilのようなWordがありますか?その場合は、その目的を説明してください。

70
shweta

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。

150
user557219

わかりませんが、nilidの代わりにのみ使用すべきだと思います。JavaとC++プログラマーはpointerと考えるobjectに。非オブジェクトポインターにはNULLを使用します。

nilは通常、Objective-Cオブジェクトタイプに使用され、NULLはcスタイルポインターに使用されます。

7
visakh7

Nil、Nullおよびnilは以下で使用されます

1> Objective C Classの場合はなし

2> Objective Cオブジェクトの場合はnil

3> Cポインターの場合はヌル

例:

1>クラスA = Nil;

2> NSString strName = nil;

3> char * pointerChar = NULL;

7
Chris Alan

クラス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であり、他には何もありません。

5

nil、NILおよびnull。要件に依存します。

NSNull

NSArrayNSDictionaryなどのコレクションは、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値

1
Bhumesh Purohit