NULL ,Nil, nil,null,<null>,(null),()

今天在写项目的过程中遇到这样一个问题,解释为下面的代码

      NSArray *array1 = [NSArray array];
      id a1= array1[0];

结果运行后就出现了这样的问题
Terminating app due to uncaught exception ‘NSRangeException’, reason: ‘* -[__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray’
在几番尝试下发现以下的代码同样会引发上面的问题

 NSArray *array = [[NSArray alloc]init];
 或者
 NSArray *array = [NSArray new];

最后发现如果我写成下面这几种的任意一种都没事

NSArray *array1;//NSArray *array1 = nil;
id a1= array1[0];

我打印了在崩或者不崩这两种情况下的数组,结果如下

array :(null)//这是没崩;
array: (
)//这是崩了

总结原因还是因为自己对NULL,null,Nil,nil,[NSNull null]这几个值的认识不清楚,所以就记录下自己的错误,下次绝不再犯

1:NULL Nil nil null [NSNull null]

我先打印了下面一段代码

 NSLog(@"[NSNull null]--%@",[NSNull null]);
 NSLog(@"nil ---:%@",nil);
 NSLog(@"NULL--%@",NULL);
 NSLog(@"Nil--%@",Nil);

结果如下

[NSNull null]--<null>
 nil ---:(null)
NULL--(null)
Nil--(null)

原来NULL,Nil,nil的本质都是null,但是他们在书面上的表达又有区别
* null:表示0值
* NULL:是c语言指针中的0值表示
* Nil:是oc类类型的0值表示
* nil:是oc对象的0值表示(oc中所有的对象都是id类型的)
* [NSNull null]:NSNull只有一个方法:+ (NSNull *) null;[NSNull null]用来在NSArray和NSDictionary中加入非nil(表示列表结束)的空值.是用于不能用nil的情况,因为nil在数组和字典中有特殊意义,作为数组或者字典结束的标志,这时如果我们想要在字典中输入一个人的信息,但是我们又不知道他的地址,这时我们如果用nil来表示,那么这个人的信息在nil这里就会结束了,这个时候我们可以用[NSNULL null]作为占位符,那么换个人的信息就不会在这里结束,如下测试

NSArray *array7 = [NSArray arrayWithObjects:@"1",nil,@"2", nil];
NSArray *array8 = [NSArray arrayWithObjects:@"1",[NSNull null],@"2", nil];

分别打印这些数组的count

~~~array8~~~1
~~~array9~~~3

可以看出array8中在添加元素时遇到第一个nil就结束了,所以count=1;
但是第二个虽然也有空对象,但是却不影响元素的添加

*向nil发送消息不会有异常,但是向[NSNull null]程序会抛出异常

2: (null),<null>,()

  • 向返回值为(null)的对象发送消息,程序不会崩溃,
  • <null> 是[NSNull null]的返回值,向它发送消息也会抛出异常
  • 对于返回值为()的对象,因为你返回的数组里面没有对象所以也会抛出异常
  • 在进行网络请求时返回来的数据可能为空,对于数组和字典分别有下面的处理

    • 对于数组

      if(result == nil){
              操作;
          }
    • 对于字典

      if ([result isEqual:[NSNull null]]) {
          操作
      }
      或者
      if (result ==[NSNull null]) {
          操作
      }
      

3:关于数组初始化的返回值

  • 返回值为()
 NSArray *array1 = [NSArray array];
 或者
 NSArray *array = [[NSArray alloc]init];
 或者
 NSArray *array = [NSArray new];
  • 返回值为(null)
NSArray *array;
NSArray *array = nil;//没有必要,如果我们不对数组初始化,默认返回值就是(null)
  • 返回值为[NSNull null]
NSArray *array = [NSNull null];

以上理解有什么有问题的地方,欢迎大家批评指正

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值