web-dev-qa-db-ja.com

Objective-CでのNULLとnil

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

179
erikprice

nilは、JavaおよびC++プログラマーがオブジェクトへのポインターと考えるidの代わりにのみ使用する必要があります。非オブジェクトポインターにはNULLを使用します。

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

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

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

226
Paul Tomblin

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

64

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

  • Objective-Cスタイルでは、nilidタイプ(およびオブジェクトへのポインター)に使用するものです。
  • Cスタイルは、NULLvoid *に使用するものであると言います。
  • C++スタイルでは通常、0を使用するだけでよいと言われています。

通常、タイプが宣言済みである言語に一致するバリアントを使用します。

52
Andrew

NULLは、C equivalentnilであり、何もへのポインターではありません。

ここで、nil is zero typed as id

NULL is zero typed as void*

重要なポイント NULLにメッセージを送信することはできません。したがって、多くの場所でObjective-Cでnilを使用することをお勧めします。

12
user2560622

彼らはほとんど同じことを除いて、

nilは、Objective-Cスタイルで使用されます。ここで、NULLはC型ポインター用であり、(void *)にtypdefされています。

3
dan14941