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 = 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值