nil,NULL,NSNull的區別


主要就以下幾點:

1、nil:一般賦值給空對象;

2、NULL:一般賦值給nil之外的其他空值。如SEL等;

  舉個栗子(好重啊~):

    [NSApp beginSheet:sheet
                modalForWindow:mainWindow

                modalDelegate:nil //pointing to an object

                didEndSelector:NULL //pointing to a non object/class

                contextInfo:NULL]; //pointing to a non object/class

3、NSNULL:NSNull只有一個方法:+ (NSNull *) null;

  [NSNull null]用來在NSArray和NSDictionary中加入非nil(表示列表結束)的空值.

4、當向nil發送消息時,返回NO,不會有異常,程序將繼續執行下去;

  而向NSNull的對象發送消息時會收到異常。

-------------------------

以下轉載自:http://blog.sina.com.cn/s/blog_722017670100v2b4.html

 

nil: A null pointer to an Objective-C object.  ( #define nil ((id)0)  )

nil 是一個對象值。

 

Nil: A null pointer to an Objective-C class.

 

NULL: A null pointer to anything else.  ( #define NULL ((void *)0)  )

NULL是一個通用指針(泛型指針)。


NSNull: A class defines a singleton object used to represent null values in collection objects (which don't allow nil values).
[NSNull null]: The singleton instance of NSNull.

[NSNull null]是一個對象,他用在不能使用nil的場合。

因為在NSArray和NSDictionary中nil中有特殊的含義(表示列表結束),所以不能在集合中放入nil值。如要確實需要存儲一個表示“什么都沒有”的值,可以使用NSNull類。NSNull只有一個方法:

+ (NSNull *) null;

 

 

Technically they're all the same, but in practice they give someone reading your code some hints about what's going on; just like naming classes with a capital letter and instances with lowercase is recommended, but not required.

If someone sees you passing NULL, they know the receiver expects a C pointer. If they see nil, they know the receiver is expecting an object. If they see Nil, they know the receiver is expecting a class. Readability.

example 1:

[NSApp beginSheet:sheet
              modalForWindow:mainWindow

              modalDelegate:nil //pointing to an object

              didEndSelector:NULL //pointing to a non object/class

              contextInfo:NULL]; //pointing to a non object/class



example 2: The values1 will only have obj1,
NSObject *obj1 = [NSObject new];
NSObject *obj2 = nil;
NSObject *obj3 = [NSObject new];
NSArray *values1 = [NSArray arrayWithObjects:obj1,obj2,obj3,nil];

example 3: The values2 have 3 objects and the second object is instance of NUSNull
NSObject *obj1 = [NSObject new];
NSObject *obj2 = [NSNull null];
NSObject *obj3 = [NSObject new];
NSArray *values2 = [NSArray arrayWithObjects:obj1,obj2,obj3,nil];

about testing:
if obj is nil , [obj message] will return NO, without NSException
if obj is NSNull , [obj message] will throw a NSException
testing NSNull: (NSNull *)obj == [NSNull null]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM