nil,NULL,NSNull,Nil区别

来源:互联网 发布:178个经典c语言源代码 编辑:程序博客网 时间:2024/06/05 18:09

1.nil

指向一个对象的指针为空 在objc.h中的定义如下所示:

#ifndef nil# if __has_feature(cxx_nullptr)#  define nil nullptr# else#  define nil __DARWIN_NULL# endif#endif

在Objective-C中用于id类型的对象

NSString *name = nil;NSURL    *url  = nil;id object      = nil;

2.Nil

指向一个类的指针为空 定义如下:

#ifndef Nil# if __has_feature(cxx_nullptr)#  define Nil nullptr# else#  define Nil __DARWIN_NULL# endif#endif

在Objective-C中用于Class类型的对象

Class aClass = Nil;Clsss bClass = [NSURL class];

3.NULL

指向C类型的指针为空 在stddef.h中定义如下:

#if defined(__need_NULL)#undef NULL#ifdef __cplusplus# if !defined(__MINGW32__) && !defined(_MSC_VER)#    define NULL __null# else#    define NULL 0#  endif#else#  define NULL ((void*)0)#endif

多用于如下例子:

int  *pInt    = NULL;char *chChar <span style="white-space:pre"> </span>= NULL;struct stStruct = NULL;

4.NSNull

在Objective-C中是一个类,只是名字中有个Null,NSNull有 + (NSNull *)null; 单例方法,多用于集合(NSArray,NSDictionary)中值为空的对象

NSArray *array = [NSArray arrayWithObjects:                      [[NSObject alloc] init],                      [NSNull null],                      @"aaa",                      nil,                      [[NSObject alloc] init],                      [[NSObject alloc] init], nil];NSLog(@"%ld", array.count); // 输出 3,NSArray以nil结尾
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:                                @"Object0", @"Key0",                                @"Object1", @"Key1",                                nil,        @"Key-nil"                                @"Object2", @"Key2",                                nil];NSLog(@"%@", dictionary); // 输出2个key-value,NSDictionary也是以nil结尾
NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];[mutableDictionary setObject:nil forKey:@"Key-nil"]; // 会引起Crash[mutableDictionary setObject:[NSNull null] forKey:@"Key-nil"]; // 不会引起Crash

所以在使用时,如下方法是比较安全的

[mutableDictionary setObject:(nil == value ? [NSNull null] : value)                      forKey:@"Key"];
0 0
原创粉丝点击