74

との違いを知りたいnilです。私はぐるぐる回って、これを見つけました:NILnull

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

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

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

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

これを私に説明してください。また、 Objective-C にNSNullorのような言葉はありますか? NSNilもしそうなら、それが何のためにあるのか説明してください。

4

6 に答える 6

155

nilObjective-C オブジェクトのリテラル null 値で、抽象型idまたは を介し​​て宣言された任意の Objective-C 型に対応し@interfaceます。例えば:

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

if (anotherObject == nil) // do something

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

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

NULL任意の C ポインターのリテラル NULL 値です。例えば、

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

NSNullnull を表すオブジェクトのクラスです。実際、オブジェクトは 1 つだけです。つまり、 によって返されるオブジェクト+[NSNull null]です。これは、リテラルの null 値、つまりオブジェクトではないnilためとは異なります。nil一方、の単一インスタンスは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 にはそのようなものはありません。

于 2011-05-06T09:19:55.450 に答える
7

よくわかりませんが、 Java および C++ プログラマーがから へと考えるようなnilの代わりにのみ使用する必要があると思います。非オブジェクト ポインターに使用します。idpointerobjectNULL

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

于 2011-05-06T08:53:27.483 に答える
7

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

1> Objective c クラスの場合はゼロ

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

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

例:

1>クラスA=なし;

2>NSString strName=nil;

3>char *pointerChar = NULL;

于 2014-02-19T06:35:00.943 に答える
5

クラスがあり、そのインスタンスをnull値に初期化する場合( Javaと同じ) MyClass 、慣例により使用されるとします。nilnull

MyClass *obj = nil;


プリミティブ ポインターを null 値 (c と同じ) に初期化する場合は、次を使用します。

int *ptr = NULL; 


null値への参照に初期化する場合( JavaClassと同じ)、使用します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)

そして in の定義__DARWIN_NULL_types.h

#define __DARWIN_NULL ((void *)0)

したがって、論理的には違いはありません。ここでの主なアイデアは、ポインタを初期化するCことObjective-Cです0。知識があればおC任せできます

int *ptr = 0;

0ポインターへの型キャストなし。0ポインターに割り当てるために型キャストする必要がないためです。

要するに、それらはすべてであり、他には0何もありません。

于 2011-05-06T09:17:53.383 に答える
4

これは、nil、NIL、null の違いを理解するのに役立ちます。

これら 3 つの値はすべて、NULL またはゼロ ポインター値を表します。違いは、NULLは任意のポインターのゼロを 表すのに対し、 nilオブジェクト(id など) に固有であり、 Nilクラス ポインターに固有であることです。 文書化の目的で適切な状況で適切な null オブジェクトを使用することは、ある種のベスト プラクティスと見なされるべきです。

以下のリンクは、何らかの形であなたを助けるかもしれません:

http://nshipster.com/nil/

リンクの重要な部分を次に示します。

ここに画像の説明を入力

于 2014-09-10T09:03:56.393 に答える