web-dev-qa-db-ja.com

Objective-CでnilとNULLを使用する必要があるのはいつですか?

これはサンプルコードです。

NSDictionary *myDictionary = [NSDictionary dictionary];
NSNumber *myNumber = [myDictionary valueForKey: @"MyNumber"];
NSLog(@"myNumber = %@", myNumber); // output myNumber = (null)

if (myNumber == nil)
    NSLog(@"test 1 myNumber == nil");

if (myNumber == NULL)
    NSLog(@"test 2 myNumber == NULL");

if ([myNumber isEqual:[NSNull null]])
    NSLog(@"test 3 myNumber == [NSNull null]");

Nil、NULL、[NSNull null]はいつ使用する必要がありますか?

163
Biranchi

nilを使用できる場所であればどこでもnullを使用できます。主な違いは、メッセージをnilに送信できるため、nullが機能しない場所で使用できることです。

通常、nilを使用します。

106
Alex

それらはタイプが異なります。それらはすべてゼロですが、NULLvoid *nilid、およびNilはクラスポインターです。

302
NSResponder

nilは、オブジェクト(Objective-Cのidタイプ)にバインド/対応する空の値です。 nil参照/アドレスを取得せず、空の値を取得しました。

NSString *str = nil;

オブジェクトを扱う場合は、nilを使用する必要があります。

if(str==nil)
    NSLog("str is empty");

NULLは、Objective-Cの非オブジェクトポインター(Cポインターのように)に使用されるようになりました。 nilNULLのように値もアドレスもありません。

char *myChar = NULL;
struct MyStruct *dStruct = NULL;

状況がある場合、struct(構造体型変数)が空であるかどうかを確認する必要がある場合、次を使用します。

if (dStruct == NULL)
    NSLog("The struct is empty");

別の例を見てみましょう

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

キー値監視の場合、コンテキストはCポインターまたはオブジェクト参照でなければなりません。ここでは、コンテキストではnilを使用できません。 NULLを使用する必要があります。

最後に、NSNullクラスは、コレクションオブジェクト(NSArray、NSDictionary)のnull値を表すために使用されるシングルトンオブジェクトを定義します。 [NSNull null]は、NSNullのシングルトンインスタンスを返します。基本的に[NSNull null]は適切なオブジェクトです。

コレクション型オブジェクトにnilオブジェクトを挿入する方法はありません。例を見てみましょう:

NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];

2行目では、NSNullオブジェクトをコレクション型オブジェクトに挿入するのが完全に公平であるため、エラーは発生しません。 3行目では、「オブジェクトをnilにすることはできません」というエラーが表示されます。 nilはオブジェクトではないからです。

26
Shad

NULLとnilは互いに等しいが、nilはオブジェクト値であり、NULLは汎用ポインター値((void*)0、具体的には)です。 [NSNull null]は、nilが許可されていない状況でnilの代わりになることを意図したオブジェクトです。たとえば、NSArrayにnil値を含めることはできません。したがって、「nil」を表す必要がある場合は、[NSNull null]を使用できます。

18
Chuck

私は次を見つけました:

objc.h

#define Nil __DARWIN_NULL   /* id of Nil class */
#define nil __DARWIN_NULL   /* id of Nil instance */

_types.h

#define __DARWIN_NULL ((void *)0)

stddef.h

#undef NULL
#ifdef __cplusplus
#undef __null  // VC++ hack.
#define NULL __null
#else
#define NULL ((void*)0)
#endif

MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

見た目は違いはありませんが、概念的なものです。

10
Colnaghi

if([NSNull null])trueを返すことに注意してください。

7
Nicolas Manzini

@cobbalからのコメントを展開するには:

MacTypes.h に含まれるもの:

#ifndef nil
   #define nil NULL
#endif
5
Justin Tanner

どちらも型キャストゼロです。機能的には、それらの間に違いはありません。すなわち、

#define NULL ((void*)0)
#define nil ((id)0)

違いはありますが、自分自身とコードを読んでいる他の人間にとってのみ、コンパイラは気にしません。

もう1つnilはオブジェクト値ですが、NULLは汎用ポインター値です。

5
Nirav

最新のOS XおよびiOS SDKの場合:

  • nilNilNULLは、Objective-CとC++ 11より前のObjective-C++で同一です。
  • nilNilstd::nullptrは、Objective-C++ with C++ 11と同じです。

様式的には、多くの人がObjective-Cオブジェクトにはnilを、他のポインタ型にはNULLまたはnullptrを使用することを好みます。私自身は現在、nilをどこでも使用しています。

[NSNull null]は、 singleton オブジェクトです。nilが値として禁止されている状況(通常、 NSArrayまたはNSDictionary)。 数値および値プログラミングのトピック:NSNullの使用

4
Greg Parker

すでに述べたように、それらは同じですが、対応するフレームワークが書かれた言語に応じてどちらか一方を使用します。

Objective-Cに関連するすべてについて、nilを使用します。例えば:

- (BOOL)doSomethingWithObjectsInArray:(NSArray *)anArray {
    if (anArray == nil) return NO;

    // process elements
    ...
}

ただし、Cフレームワーク(AddressBookフレームワークやCoreFoundationなど)からのデータモデルの有効性をチェックするときは、NULLを使用します。例えば:

- (BOOL)showABUnknownPersonVCForABRecordRef:(ABRecordRef)aRecord {
    if (aRecord == NULL) return NO;

    // set-up the ABUnknownPersonViewController and display it on screen
    ..
}

このように、Obj-CまたはCベースのコードを扱っている場合、コードに微妙な手がかりがあります。

3
Tafkadasoh

一部のコンテキストには違いがあります。

文字通り、Nullは文字です:ASCII 0。

Nilは値なしの空白に相当します。

プログラミングのコンテキストに応じて、これは大きな違いになります。

2
Meatloaf

nilは、何もないオブジェクトポインタです。意味的にNULLとは異なりますが、技術的にはと同等です

フレームワークレベルでは、FoundationはNSNullを定義します。これは、シングルトンNSNullオブジェクトを返すクラスメソッド+ nullを定義します。 NSNullnilまたはNULLとは異なりますゼロ値ではなく、actualobject

さらに、Foundation/NSObjCRuntime.hでは、Nilclasspointer何にも。

詳細はこちらをご覧ください-nil/Nil/NULL/NSNull

1
Shubham Jain

基本的に:nil:オブジェクト上のNULLポインターとnull:他のタイプのポインター用

0
gerachev

たとえば、タイプ(NSError **)の出力パラメーターでObjective-Cメソッドを呼び出す場合は、NULLを使用します。

この場合、人々がNULLではなくnilを提供する多くのサンプルコードがWeb上にあります。これは、ポインターへのポインターであり、したがってObjective-Cオブジェクトタイプではないためです。上記のように、Objective-Cオブジェクトタイプにはnilを使用する必要があります。

0
bio

nilは値がないことを意味し、NULLはオブジェクトなしを表し、

NSArray * array = @ [@ "Hello World!"、@ 101、[NSNULL null]];

ここで、[NSNULL null]はオブジェクトがないことを意味するオブジェクトです。同時に、nilを追加してオブジェクトがないことを示すことはできません。

チェックにもnilと[NSNUll null]の両方を使用できます。

0
Roshanboy4u

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

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

http://nshipster.com/nil/

nil-> Objective-Cオブジェクトのリテラルnull値。

Nil-> Objective-Cクラスのリテラルnull値。

NULL-> CポインターのリテラルNULL値。

NSNULL-> nullを表すために使用されるシングルトンオブジェクト。

0
Subhakar Prabhu