Objective-CにおけるNULLとnil


182

observeValueForKeyPath:ofObject:change:context:-なぜコンテキストポインタを指定しない場合のNULL代わりにドキュメントが使用されるのnilですか?


私の意見では、オブジェクトはnil、クラスはNil、オブジェクトまたはクラスにNULLを使用
ThanhVũTrầnNov

回答:


227

nilidJavaとC ++プログラマーがオブジェクトへのポインターとして考えるものの代わりにのみ使用する必要があります。NULL非オブジェクトポインターに使用します。

そのメソッドの宣言を見てください。

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

コンテキストはvoid *(つまり、Cスタイルのポインター)なので、(型である)ではなく(NULLとして宣言されることもあります)を使用することをお勧めします。(void *)0nilid


2
しかし、のタイプ以来contextobserveValueForKeyPath:ofObject:change:context:あるvoid *として、データが渡されていないことを平均することをcontextオブジェクトポインタだろうか?それはよくあることだと思います。それが、ドキュメントがのNULL代わりに常に使用される理由について私が混乱している理由ですnil
erikprice

2
コンテキストのタイプ:そのメソッドでは「void *」です。「nil」は「void *」ではなく、NULLです。
ポールトンブリン

3
あなたはできる。void *は任意のポインターです。それでも、NULLが正しい定数であることは間違いありません。
Peter Hosey、

3
彼らはvoid *と言った。NULLはvoid *で、nilはidです。したがって、NULLを渡します。nilを渡すと、あなたは読者に嘘をつきます。読者はこのメソッドがIDをとると考えます。
Peter Hosey、

12
別の言い方をすると、NULLはより広い型であり、nilはNULLのサブセットです。一般に、取り除ける最も広いタイプを使用します(つまり、Javaでは、ベクターではなくコレクションを期待するようにメソッドを記述します。ベクターからの特定のものが必要でない限り)
Paul Tomblin '17

65

技術的には同じもの(0)ですが、Objective-Cオブジェクトタイプには通常nilが使用され、cスタイルのポインタ(void *)にはNULLが使用されます。


8
また、NULLとは定義が異なりnilます。nilとして定義され(id)0ます。NULLそうではありません。

14
@WTPでMacTypes.hを読み取ると、#define nil NULLが宣言されます
jbat100

1
それはとても興味深いです。スタイルポイント以外は問題ないようです。YES / TRUEやNO / FALSEのようなものです。
ブレナン2013年

1
@Brennan、それは完全に真実ではありません。nilがNULLとして定義されているからといって、舞台裏に他の隠された実装があるわけではありません。たとえば、IBActionはvoidとして定義されていますが、ボタンなどのアクションにアタッチするメソッドを表示するときにインターフェイスビルダーを使用すると、意味が異なります。
ミカイアウォレス

53

それらは技術的には同じものであり、スタイルのみが異なります。

  • Objective-Cスタイルはnilid型(およびオブジェクトへのポインター)に何を使用するかを示しています。
  • CスタイルはそれNULLがあなたが使うものだと言っていますvoid *
  • C ++スタイルは通常、を使用するだけでよいと言っています0

私は通常、型が宣言されている言語に一致するバリアントを使用ます。


14

NULLあるC equivalentのは、nil何へのポインタ。

ここでnil is zero typed as id

NULL is zero typed as void*

NULLにメッセージを送信できない重要な点の1つ。そのため、多くの場所で、objective-Cでnilを使用することをお勧めします。


4

ほぼ同じですが、

nilObjective-Cスタイルで使用されます。どこNULLC型ポインタのためであるとにtypdef'edされます(void *)


1
これはこの既存の答えのほとんどの繰り返しではありませんか?
パン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.