最近面試時(shí)被多次問到這個(gè)問題,自己也了解一些,但是沒有通過代碼驗(yàn)證,所以,說的時(shí)候也沒有底氣,不敢打包票,今天就驗(yàn)證了一下。
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沒有驗(yàn)證
從上面可以看出,給nil對(duì)象發(fā)送消息,是不會(huì)崩潰的,但是要么返回默認(rèn)的0,要么返回nil對(duì)象。至于id類型的為什么返回0x0,而不是返回nil,我也是有些疑問的,nil和0x0的具體區(qū)別還有待研究。
而如果給nunull對(duì)象發(fā)送消息,則會(huì)引起crash,猜測(cè)因?yàn)樗鼪]有任何方法,所以會(huì)拋出'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x10fd9a4c0'的異常。