Toll-free Bridged and NULL v. nil

I always wondered if NULL got toll-free bridged to nil.  I figured that NULL is a pointer value of all zeroes and nil is actually a pointer to a special object.  So my hypothesis was they weren’t interchangeable.  I was wrong.

  // Check to see what happens to a toll-free bridged ptr when it gets set to NULL.
  CFStringRef stringRef = NULL;
  NSString *str = (NSString *) stringRef;
  if (str == nil)
  {
    NSLog(@"str is nil");
  }
  else
  {
    NSLog(@"str is NOT nil!!!");
  }

  NSLog(@"The object value of nil is %@", nil);
  NSLog(@"The numeric value of nil is %d", nil);

Yields the following output:

2009-12-04 10:51:58.532 TollFreeBridging[18053:a0f] str is nil
2009-12-04 10:51:58.535 TollFreeBridging[18053:a0f] The object value of nil is (null)
2009-12-04 10:51:58.536 TollFreeBridging[18053:a0f] The numeric value of nil is 0

And then there’s NSNull….