1> 沒有存儲任何內存地址的指針就稱爲空指針(NULL指針)html
2> 空指針就是被賦值爲0的指針,在沒有被具體初始化以前,其值爲0。ios
下面兩個都是空指針:函數
1 Student *s1 = NULL; 2 3 Student *s2 = nil;
"野指針"不是NULL指針,是指向"垃圾"內存(不可用內存)的指針。野指針是很是危險的。spa
接下來用一個簡單的例子對比一下野指針和空指針的區別指針
1 Student *stu = [[Student alloc] init]; 2 3 [stu setAge:10]; 4 5 [stu release]; 6 7 [stu setAge:10];
運行程序,你會發現第7行報錯了,是個野指針錯誤!調試
1> 執行完第1行代碼後,內存中有個指針變量stu,指向了Student對象code
Student *stu = [[Student alloc] init];
假設Student對象的地址爲0xff43,指針變量stu的地址爲0xee45,stu中存儲的是Student對象的地址0xff43。即指針變量stu指向了這個Student對象。htm
2> 接下來是第3行代碼對象
[stu setAge:10];
這行代碼的意思是:給stu所指向的Student對象發送一條setAge:消息,即調用這個Student對象的setAge:方法。目前來講,這個Student對象仍存在於內存中,因此這句代碼沒有任何問題。blog
3> 接下來是第5行代碼
[stu release];
這行代碼的意思是:給stu指向的Student對象發送一條release消息。在這裏,Student對象接收到release消息後,會立刻被銷燬,所佔用的內存會被回收。
(release的具體用法會放到OC內存管理中詳細討論)
Student對象被銷燬了,地址爲0xff43的內存就變成了"垃圾內存",然而,指針變量stu仍然指向這一塊內存,這時候,stu就稱爲了野指針!
4> 最後執行了第7行代碼
[stu setAge:10];
這句代碼的意思仍然是: 給stu所指向的Student對象發送一條setAge:消息。可是在執行完第5行代碼後,Student對象已經被銷燬了,它所佔用的內存已是垃圾內存,若是你還去訪問這一塊內存,那就會報野指針錯誤。這塊內存已經不可用了,也不屬於你了,你還去訪問它,確定是不合法的。因此,這行代碼報錯了!
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就再也不指向任何內存了
由於stu是個空指針,沒有指向任何對象,所以第9行的setAge:消息是發不出去的,不會形成任何影響。固然,確定也不會報錯。
1> 利用野指針發消息是很危險的,會報錯。也就是說,若是一個對象已經被回收了,就不要再去操做它,不要再嘗試給它發消息。
2> 利用空指針發消息是沒有任何問題的,也就是說下面的代碼是沒有錯誤的: