What's the difference between [NSNull null] and nil?

后端 未结 6 657
[愿得一人]
[愿得一人] 2020-11-30 03:07

Here\'s a context where I have seen that:

NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
            


        
相关标签:
6条回答
  • 2020-11-30 03:19

    You cannot add a nil value to an NSArray or NSMutableArray. If you need to store a nil value, you need to use the NSNull wrapper class, as shown in that snippet you have. This is specified in the documentation.

    0 讨论(0)
  • 2020-11-30 03:22

    The NSNull class defines a singleton object you use to represent null values in situations where nil is prohibited as a value (typically in a collection object such as an array or a dictionary).

    You cannot add a nil value to an NSArray or NSMutableArray. If you need to store a nil value, you need to use the NSNull wrapper class.

    Collection classes like NSArray and NSDictionary cannot contain nil values. NSNULL was created specifically as a placeholder for nil. It can be put into collection classes, and only takes up space.

    See the link for reference

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html

    0 讨论(0)
  • 2020-11-30 03:24

    Collection classes like NSArray and NSDictionary cannot contain nil values. NSNULL was created specifically as a placeholder for nil. It can be put into collection classes, and only takes up space.

    NSNull defines a singleton object, which means that there's only ever a single instance of NSNull (which you create using [NSNull null]), but it can be used in as many places as you wish.

    0 讨论(0)
  • 2020-11-30 03:27

    Directly from Apple:

    The NSNull class defines a singleton object you use to represent null values in situations where nil is prohibited as a value (typically in a collection object such as an array or a dictionary).

    So in your example, that's exactly what's happening, the programmer is choosing to put a null object into the controllers array, where nil is not allowed as a value.

    0 讨论(0)
  • 2020-11-30 03:33

    nil marks the end of an array after an array of objects...

    0 讨论(0)
  • 2020-11-30 03:45

    We all agree that [NSNull null] is useful as a placeholder where an object is required, as elaborated above. But unless it's explicitly used in assignment for your object, it should not be used in comparison, a mistake I have made in the past.

    id a;
    NSLog(@"Case 1");
    if (a == nil) NSLog(@"a == nil");
    if (a == Nil) NSLog(@"a == Nil");
    if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");
    
    NSLog(@"Case 2");
    a = [NSNull null];
    if (a == nil) NSLog(@"a == nil");
    if (a == Nil) NSLog(@"a == Nil");
    if ([a isEqual:[NSNull null]]) NSLog(@"a isEqual:[NSNull null]");
    

    Output:

    2014-01-31 10:57:11.179 MCDocsApp[13266:a0b] Case 1

    2014-01-31 10:57:11.179 MCDocsApp[13266:a0b] a == nil

    2014-01-31 10:57:11.179 MCDocsApp[13266:a0b] a == Nil

    2014-01-31 10:57:11.180 MCDocsApp[13266:a0b] Case 2

    2014-01-31 10:57:11.180 MCDocsApp[13266:a0b] a isEqual:[NSNull null]

    0 讨论(0)
提交回复
热议问题