今天在写项目的过程中遇到这样一个问题,解释为下面的代码
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];
以上理解有什么有问题的地方,欢迎大家批评指正