1.空指針
沒(méi)有存儲(chǔ)任何內(nèi)存地址的指針就是空指針(null指針)
空指針就是被賦值為nil的指針,在沒(méi)有被初始化之前為nil
2.野指針
野指針不是”nil”指針,是指向”垃圾內(nèi)存"的指針(不可用內(nèi)存)
野指針在程序運(yùn)行時(shí)很危險(xiǎn)
3.當(dāng)野指針訪問(wèn)已經(jīng)釋放的對(duì)象時(shí)程序會(huì)崩潰
舉例:
1)Person *p= [Person alloc]init];//創(chuàng)建person對(duì)象
2)[p setValue:10 forKey:@”age”];//給對(duì)象中age屬性賦值
3)[p release];//給對(duì)象發(fā)送消息,釋放對(duì)象
4)[p setValue : “child” forKey:@“name”];//程序崩潰
原因:3)后Person的對(duì)象內(nèi)存已經(jīng)被釋放,但此時(shí)p仍然保存之前的地址,此時(shí)繼續(xù)訪問(wèn)對(duì)象內(nèi)存會(huì)導(dǎo)致程序崩潰.
解決辦法:
1)Person *p= [Person alloc]init];//創(chuàng)建person對(duì)象
2)[p setValue:10 forKey:@”age”];//給對(duì)象中age屬性賦值
3)[p release];//給對(duì)象發(fā)送消息,釋放對(duì)象
4)p = nil;//此時(shí)p變成了空指針 不指向任何內(nèi)存
4)[p setValue : “child” forKey:@“name”];//此時(shí)相當(dāng)于給nil發(fā)送消息程序不會(huì)報(bào)錯(cuò) 輸出p.name = 0 但java,c/c++中程序也會(huì)報(bào)錯(cuò)
4.由此也可以得出:在Objective-C中向nil發(fā)送消息是完全有效的——只是在運(yùn)行時(shí)不會(huì)有任何作用.