197

In observeValueForKeyPath:ofObject:change:context: - why do the docs use NULL instead of nil when not specifying a context pointer?

1
  • in my opinion, object is nil, class is Nil, and NULL using for object or class Commented Nov 9, 2012 at 1:45

5 Answers 5

235

nil should only be used in place of an id, what we Java and C++ programmers would think of as a pointer to an object. Use NULL for non-object pointers.

Look at the declaration of that method:

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

Context is a void * (ie a C-style pointer), so you'd definitely use NULL (which is sometimes declared as (void *)0) rather than nil (which is of type id).

Sign up to request clarification or add additional context in comments.

14 Comments

But since the type of context in observeValueForKeyPath:ofObject:change:context: is void *, doesn't that mean that the data passed as the context could be an object pointer? I would think that to be a common case. That's why I'm confused as to why the docs always use NULL instead of nil.
The type of context: in that method is "void *". "nil" is not a "void *", but NULL is.
You can. void * is any pointer. Nonetheless, you are absolutely right that NULL is the correct constant there.
They said void *. NULL is for void * and nil is for id. Therefore, you pass NULL. If you pass nil, you are lying to your reader, who will think this method takes an id.
Or to think of it another way, NULL is a broader type, and nil is a subset of NULL. In general, use the broadest type you can get away with (ie in Java, write your method to expect a Collection instead of a Vector, unless you need something specific from Vector)
|
68

They're technically the same thing (0), but nil is usually used for an Objective-C object type, while NULL is used for c-style pointers (void *).

4 Comments

Also, NULL is differently defined than nil. nil is defined as (id)0. NULL isn't.
@WTP if you read through MacTypes.h, it declares #define nil NULL
That is very interesting. It seems it does not matter than other than for style points. It's like YES/TRUE and NO/FALSE.
@Brennan, That's not entirely true, just because nil is defined as NULL doesn't mean there's some other hidden implementation behind the scenes. For example, IBAction is defined as void but it has a different meaning when using interface builder when displaying methods to attach to actions on buttons and such.
54

They're technically the same thing and differ only in style:

  • Objective-C style says nil is what to use for the id type (and pointers to objects).
  • C style says that NULL is what you use for void *.
  • C++ style typically says that you should just use 0.

I typically use the variant that matches the language where the type is declared.

Comments

15

NULL is the C equivalent of nil, a pointer to nothing;

where nil is zero typed as id,

NULL is zero typed as void*.

One important point you can’t send a message to NULL. So it is preferred to use nil in objective-C at many places.

Comments

4

They almost are the same thing except,

nil is used in an Objective-C style. where NULL is for C type pointers and is typdef'ed to (void *).

1 Comment

Isn't this pretty much a repeat of this existing answer?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.