美文网首页iOS
OC里的NULL、nil、Nil、NSNull

OC里的NULL、nil、Nil、NSNull

作者: 不吃鸡爪 | 来源:发表于2017-09-28 23:01 被阅读63次

在C语言里用0来作为“不存在”的原始值,而用NULL作为指针空值。OC里表示“不存在”的四种方式为:NULLnilNilNSNull

NULL

NULL本质为:(void*)0

使用惯例NULL一本用于表示C指针空值,比如:
int *a = NULL;
char *b = NULL;
struct User *userM = NULL;

当某个API想要传入某个指针(void *),而不是id类型时,最好还是传入NULL,以此保持了Objective-C严谨的定义。比如NSArray的这个API,argument要求的是id,所以传入nil会比较好。

- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument

而像NSMutableArray的sortUsingFunction:context:

- (void)sortUsingFunction:(NSInteger (*)(ObjectType, ObjectType, void * __nullable))compare context:(nullable void *)context;

在这里,context传入NULL会比传入nil好。

nil

nil本质为:(void*)0
nil特点:虽然为空,仍然可以向它发送消息,在nil上调用方法都返回一个零值。

NSString *name;
NSLog(@"%p  %hhd", name, [name isEqualToString:@"CoderKo1o"]); // 0x0 0

使用惯例nil用于表示指向OC对象(id类型的对象,或者使用@interface声明的OC对象)的指针为空,例如:

NSString *string = nil;
id object = nil;

Nil

Nil本质也是:(void *)0

使用惯例Nil用于表示指向OC类(Class)类型的指针为空,例如:

Class someClass = Nil;
Class stringClass = [NSString class];

NSNull

NSNull是一个OC对象,是一个用于表示空值的类,只有一个单例方法:+[NSNull null],一般用于在集合对象中保存一个空的占位对象。

使用惯例:在Foundation集合对象(NSArray、NSDictionary、NSSet等)中有一个nil值得缺陷,因为语法规定了这些集合是以nil为结束标志的。因此无法用nil来存储一个空值,所以一般使用[NSNull null]空对象来存储。

NSArray * array = [NSArray arrayWithObjects:@"name",@"age", nil]; 
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"object",@"key",@"zhh",@"name",nil];

当如下情况时,数组里只有name和age:
NSArray * array = [NSArray arrayWithObjects:@"name",@"age", nil,@"wo",nil];

下面的使用时正确的
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNull null] forKey:@"someKey"];

日常使用

  • 判断数组元素是否为空
NSString *element = [array objectAtIndex:2];  
if ((NSNull *)element == [NSNull null]) {

}
  • 判断字典对象的元素是否为空
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"iPhone", @"First", @"iPad", @"Second", nil];

NSString *value = [dictionary objectForKey:@"First"];
if ((NSNull *)value == [NSNull null]) {

}

总结


参考文档

相关文章

  • NSObject——概念原理

    1、野指针 2、僵尸对象 3、nil/Nil/NULL/NSNull的区别 nil:指向oc中对象的空指针 Nil...

  • Objective-C的空

    nil:OC为空 Nil:OC的类为空 NULL:c/c++的空指针 NSNull:对nil的包装 可以存储到数组...

  • 关于nil null一些小知识

    1.OC中的nil Nil NULL NSNull nil:是指OC中"对象"的空指针,所以基本数据类型和结构体不...

  • iOS 每天一道面试题

    同为菜逼,共同努力。 1.nil Nil NULL NSNull 区别。 nil:指向oc中对象的空指针,针对对象...

  • OC里的NULL、nil、Nil、NSNull

    在C语言里用0来作为“不存在”的原始值,而用NULL作为指针空值。OC里表示“不存在”的四种方式为:NULL、ni...

  • iOS 空值总结

    一、nil,Nil,NSNull及NULL的区别 1、nil:指向一个对象的空指针(对于OC中的对象而使用的)。 ...

  • iOS 空值总结

    一、nil,Nil,NSNull及NULL的区别 1、nil:指向一个对象的空指针(对于OC中的对象而使用的)。 ...

  • Objective-c nil, Nil, NULL和NSNul

    在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别: 一、nil:对象为空定义...

  • OC的NULL/nil/Nil/NSNull

    如何表达不存在确实是个哲学问题。Objective-C有如下几种不同类型的空。 对象(Object):是对事物的抽...

  • Objective-C中nil、Nil、NULL和NSNull的

    在OC中可能经常会遇到 nil,Nil,NULL和NSNull,下面分析一下之间的区别: SymbolValueM...

网友评论

    本文标题:OC里的NULL、nil、Nil、NSNull

    本文链接:https://www.haomeiwen.com/subject/lyavextx.html