これはサンプルコードです。
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]はいつ使用する必要がありますか?
nil
を使用できる場所であればどこでもnull
を使用できます。主な違いは、メッセージをnil
に送信できるため、null
が機能しない場所で使用できることです。
通常、nil
を使用します。
それらはタイプが異なります。それらはすべてゼロですが、NULL
はvoid *
、nil
はid
、およびNil
はクラスポインターです。
nilは、オブジェクト(Objective-Cのidタイプ)にバインド/対応する空の値です。 nil参照/アドレスを取得せず、空の値を取得しました。
NSString *str = nil;
オブジェクトを扱う場合は、nilを使用する必要があります。
if(str==nil)
NSLog("str is empty");
NULLは、Objective-Cの非オブジェクトポインター(Cポインターのように)に使用されるようになりました。 nil、NULLのように値もアドレスもありません。
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はオブジェクトではないからです。
NULLとnilは互いに等しいが、nilはオブジェクト値であり、NULLは汎用ポインター値((void*)0
、具体的には)です。 [NSNull null]
は、nilが許可されていない状況でnilの代わりになることを意図したオブジェクトです。たとえば、NSArrayにnil値を含めることはできません。したがって、「nil」を表す必要がある場合は、[NSNull null]
を使用できます。
私は次を見つけました:
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 */
見た目は違いはありませんが、概念的なものです。
if([NSNull null])
はtrue
を返すことに注意してください。
どちらも型キャストゼロです。機能的には、それらの間に違いはありません。すなわち、
#define NULL ((void*)0)
#define nil ((id)0)
違いはありますが、自分自身とコードを読んでいる他の人間にとってのみ、コンパイラは気にしません。
もう1つnilはオブジェクト値ですが、NULLは汎用ポインター値です。
最新のOS XおよびiOS SDKの場合:
nil
とNil
とNULL
は、Objective-CとC++ 11より前のObjective-C++で同一です。nil
とNil
とstd::nullptr
は、Objective-C++ with C++ 11と同じです。様式的には、多くの人がObjective-Cオブジェクトにはnil
を、他のポインタ型にはNULL
またはnullptr
を使用することを好みます。私自身は現在、nil
をどこでも使用しています。
[NSNull null]
は、 singleton オブジェクトです。nil
が値として禁止されている状況(通常、 NSArray
またはNSDictionary
)。 数値および値プログラミングのトピック:NSNullの使用
すでに述べたように、それらは同じですが、対応するフレームワークが書かれた言語に応じてどちらか一方を使用します。
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ベースのコードを扱っている場合、コードに微妙な手がかりがあります。
一部のコンテキストには違いがあります。
文字通り、Nullは文字です:ASCII 0。
Nilは値なしの空白に相当します。
プログラミングのコンテキストに応じて、これは大きな違いになります。
nilは、何もないオブジェクトポインタです。意味的にNULLとは異なりますが、技術的にはと同等です。
フレームワークレベルでは、FoundationはNSNullを定義します。これは、シングルトンNSNullオブジェクトを返すクラスメソッド+ nullを定義します。 NSNullはnilまたはNULLとは異なりますゼロ値ではなく、actualobject。
さらに、Foundation/NSObjCRuntime.hでは、Nilはclasspointer何にも。
基本的に:nil:オブジェクト上のNULLポインターとnull:他のタイプのポインター用
たとえば、タイプ(NSError **)の出力パラメーターでObjective-Cメソッドを呼び出す場合は、NULLを使用します。
この場合、人々がNULLではなくnilを提供する多くのサンプルコードがWeb上にあります。これは、ポインターへのポインターであり、したがってObjective-Cオブジェクトタイプではないためです。上記のように、Objective-Cオブジェクトタイプにはnilを使用する必要があります。
nilは値がないことを意味し、NULLはオブジェクトなしを表し、
NSArray * array = @ [@ "Hello World!"、@ 101、[NSNULL null]];
ここで、[NSNULL null]はオブジェクトがないことを意味するオブジェクトです。同時に、nilを追加してオブジェクトがないことを示すことはできません。
チェックにもnilと[NSNUll null]の両方を使用できます。
これは、nil、NIL、およびnullの違いを理解するのに役立ちます。
以下のリンクは何らかの方法であなたを助けるかもしれません:
nil-> Objective-Cオブジェクトのリテラルnull値。
Nil-> Objective-Cクラスのリテラルnull値。
NULL-> CポインターのリテラルNULL値。
NSNULL-> nullを表すために使用されるシングルトンオブジェクト。