最近面试时被多次问到这个问题,自己也了解一些,但是没有通过代码验证,所以,说的时候也没有底气,不敢打包票,今天就验证了一下。
NSString*str =nil;
NSIntegerlen = str.length;//输出0
NSString*subStr = [strsubstringFromIndex:2];// 0
NSArray*arr =nil;
NSIntegercou= arr.count;// 0
idobj = arr[0];// obj = (id) 0x0
NSString*obj2 = arr[3];// obj2 = (nsstring *)nil
NSString*obj3 = arr[0];// obj3 = (nsstring *)nil
idobj4 = arr[4];// obj4 = (id) 0x0
NSString*str1 = [NSNullnull];
NSIntegerlen1 = str1.length;// crash
NSArray*arr1 = [NSNullnull];
NSIntegercou1= arr1.count;// crash没有验证
从上面可以看出,给nil对象发送消息,是不会崩溃的,但是要么返回默认的0,要么返回nil对象。至于id类型的为什么返回0x0,而不是返回nil,我也是有些疑问的,nil和0x0的具体区别还有待研究。
而如果给nunull对象发送消息,则会引起crash,猜测因为它没有任何方法,所以会抛出'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x10fd9a4c0'的异常。
网友评论
NSIntegerlen1 = str1.length;// crash 试了 不会crach啊