OC中的空值nil\Nil\NULL\NSNull的区别

nilNilNULL[NSNull null]都是用来表示“空”或“零”。只不过表示不同种类的的“空”或“零”。也许和00.0一样,都表示“零”,但是一个对应整型,一个对应浮点型。

一、nil

  • 定义
// objc.h

#ifndef nil
# if __has_feature(cxx_nullptr) // 判断C++中是否有nullptr特性,一般iOS中无用
#   define nil nullptr
# else
#   define nil __DARWIN_NULL // iOS 中nil一般定义为__DARWIN_NULL。
# endif
#endif
  • 说明:

    • __DARWIN_NULL的定义(_types.h),在非C++代码的最终形式为#define __DARWIN_NULL ((void *)0),即iOS中nil的定义形式为(void *) 0
    • 此处nil用于表示指向OC中对象的指针为空,nil对应OC中id类型对象,表示OC对象的字面空值。
  • 举例

NSArray *array = nil;
NSString *string = nil;
NSDictionary *dict = nil;
TestObject *ob = nil;
  • 附加

刚被分配的NSObject的内容被设置为0。也就是说那个对象所有的指向其他对象的指针都从nil开始,所以在 init方法中设置self.(association) = nil 之类的表达是没有必要的。

nil最显著的行为是,它虽然为零,仍然可以有消息发送给它。

NSString *test = nil;  
if ([test isEqualToString:@"aa"]) {
    NSLog(@"test");
} else {
    NSLog(@"%lu",(unsigned long)[test length]);
}

二、Nil

  • 定义
// objc.h

#ifndef Nil
# if __has_feature(cxx_nullptr) // 判断C++中是否有nullptr特性,一般iOS中无用
#   define Nil nullptr
# else
#   define Nil __DARWIN_NULL
# endif
#endif
  • 说明:

    • Nilnil的定义最后结果相同,都为(void *)0
    • Nil指向一个类的空指针,表示对类进行赋空值。Nil是OC类类型的书面空值,对应Class类型对象。
  • 举例

Class testClass = Nil;

三、NULL

  • 定义
#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus  // 判断是否C++代码
#  if !defined(__MINGW32__) && !defined(_MSC_VER)
#    define NULL __null
#  else
#    define NULL 0
#  endif
#else
#  define NULL ((void*)0) // 最终定义形式
#endif
  • 说明
    • NULL最终定义形式(void*)0,与nilNil相同。不过NULL指向其他类型(如:基本类型、C类型)的空指针, 用于对非对象指针赋空值。

四、NSNull

  • 定义
// NSNull.h
@interface NSNull : NSObject <NSCopying, NSSecureCoding>

+ (NSNull *)null; // NSNull是一个类,有唯一的类方法

@end
  • 说明

    • OC的一个类,类方法返回一个空值对象。通常用于在集合对象中保存一个空的占位对象。即在集合对象中,表示空值的对象。
  • 举例

NSArray *array = @[[NSNull null],@"a",@"2"];
NSLog(@"%@",array);// ("<null>",a,2)
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:[NSNull null] forKey:@"1"];
[dict setObject:@"2" forKey:@"2"];
NSLog(@"%@",[dict allValues]);// ("<null>",2)

五、总结

nilNillNULL[NSNull null]都表示空值,只是对应不同的类型。

标识定义含义
nil(void*)0(id)0指向OC对象的空指针
Nil(void*)0(Class)0指向OC类的空指针
NULL(void*)0(void*)0C的空指针
NSNull类名[NSNull null]空值对象/值为空的对象

附:NILNSNilNSNULL OC中不存在。

参考:
https://nshipster.cn/nil/
https://blog.csdn.net/wzzvictory/article/details/18413519
https://magicalboy.com/null-value-in-objective-c

多看点,然后自己整理,重复一遍,整明白,搞清楚,也就懂了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值