nil
、Nil
、NULL
、[NSNull null]
都是用来表示“空”或“零”。只不过表示不同种类的的“空”或“零”。也许和0
与0.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
-
说明:
Nil
和nil
的定义最后结果相同,都为(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
,与nil
、Nil
相同。不过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)
五、总结
nil
、Nill
、NULL
、[NSNull null]
都表示空值,只是对应不同的类型。
标识 | 定义 | 值 | 含义 |
---|---|---|---|
nil | (void*)0 | (id)0 | 指向OC对象的空指针 |
Nil | (void*)0 | (Class)0 | 指向OC类的空指针 |
NULL | (void*)0 | (void*)0 | C的空指针 |
NSNull | 类名 | [NSNull null] | 空值对象/值为空的对象 |
附:NIL
、NSNil
、NSNULL
OC中不存在。
参考:
https://nshipster.cn/nil/
https://blog.csdn.net/wzzvictory/article/details/18413519
https://magicalboy.com/null-value-in-objective-c
多看点,然后自己整理,重复一遍,整明白,搞清楚,也就懂了。