一了袁、什么是空指針和野指針
1.空指針
1> 沒有存儲任何內(nèi)存地址的指針就稱為空指針(NULL指針)
2> 空指針就是被賦值為0的指針鼎天,在沒有被具體初始化之前罢防,其值為0。
Student *s1 = NULL;
Student *s2 = nil;
2.野指針
"野指針"不是NULL指針,是指向"垃圾"內(nèi)存(不可用內(nèi)存)的指針悠垛。野指針是非常危險的线定。
二、野指針和空指針例子
1.首先确买,打開Xcode的內(nèi)存管理調(diào)試開關(guān)斤讥,它能幫助檢測垃圾內(nèi)存
2.自定義Student類,在main函數(shù)中添加下列代碼
Student *stu = [[Student alloc] init];
[stu setAge:10];
[stu release];
[stu setAge:10];
運行程序湾趾,你會發(fā)現(xiàn)第7行報錯了芭商,是個野指針錯誤!
3.接下來分析一下報錯原因
1> 執(zhí)行完第1行代碼后搀缠,內(nèi)存中有個指針變量stu铛楣,指向了Student對象
Student *stu = [[Student alloc] init];
假設(shè)Student對象的地址為0xff43,指針變量stu的地址為0xee45艺普,stu中存儲的是Student對象的地址0xff43簸州。即指針變量stu指向了這個Student對象。
2> 接下來是第3行代碼
[stu setAge:10];
這行代碼的意思是:給stu所指向的Student對象發(fā)送一條setAge:消息歧譬,即調(diào)用這個Student對象的setAge:方法岸浑。目前來說,這個Student對象仍存在于內(nèi)存中缴罗,所以這句代碼沒有任何問題助琐。
3> 接下來是第5行代碼
[stu release];
這行代碼的意思是:給stu指向的Student對象發(fā)送一條release消息。在這里面氓,Student對象接收到release消息后兵钮,會馬上被銷毀,所占用的內(nèi)存會被回收舌界。
(release的具體用法會放到OC內(nèi)存管理中詳細(xì)討論)
Student對象被銷毀了掘譬,地址為0xff43的內(nèi)存就變成了"垃圾內(nèi)存",然而呻拌,指針變量stu仍然指向這一塊內(nèi)存葱轩,這時候,stu就稱為了野指針藐握!
4> 最后執(zhí)行了第7行代碼
[stu setAge:10];
這句代碼的意思仍然是: 給stu所指向的Student對象發(fā)送一條setAge:消息靴拱。但是在執(zhí)行完第5行代碼后,Student對象已經(jīng)被銷毀了猾普,它所占用的內(nèi)存已經(jīng)是垃圾內(nèi)存袜炕,如果你還去訪問這一塊內(nèi)存,那就會報野指針錯誤初家。這塊內(nèi)存已經(jīng)不可用了偎窘,也不屬于你了乌助,你還去訪問它,肯定是不合法的陌知。所以他托,這行代碼報錯了!
4.如果改動一下代碼仆葡,就不會報錯
1 Student *stu = [[Student alloc] init];
2
3 [stu setAge:10];
4
5 [stu release];
6
7 stu = nil;
8
9 [stu setAge:10];
注意第7行代碼赏参,stu變成了空指針,stu就不再指向任何內(nèi)存了
因為stu是個空指針浙芙,沒有指向任何對象登刺,因此第9行的setAge:消息是發(fā)不出去的,不會造成任何影響嗡呼。當(dāng)然纸俭,肯定也不會報錯。
5.總結(jié)
1> 利用野指針發(fā)消息是很危險的南窗,會報錯揍很。也就是說,如果一個對象已經(jīng)被回收了万伤,就不要再去操作它窒悔,不要再嘗試給它發(fā)消息。
2> 利用空指針發(fā)消息是沒有任何問題的敌买,也就是說下面的代碼是沒有錯誤的:
[nil setAge:10];
轉(zhuǎn)載:http://www.cnblogs.com/mjios/archive/2013/04/22/3034788.html