nil、Nil、NULL与NSNull的区别

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有单例方法,多用于集合(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"];

不能接受失败,也意味太想去成功了,从心理学上解释,

nil、Nil、NULL与NSNull的区别

相关文章:

你感兴趣的文章:

标签云: