【Objective-C】09-空指針和野指針
一、什麽是空指針和野指針
1.空指針
1> 沒有存儲不論什麽內存地址的指針就稱為空指針(NULL指針)
2> 空指針就是被賦值為0的指針。在沒有被詳細初始化之前。其值為0。
以下兩個都是空指針:
1 Student *s1 = NULL; 2 3 Student *s2 = nil;
2.野指針
"野指針"不是NULL指針,是指向"垃圾"內存(不可用內存)的指針。野指針是很危急的。
回到頂部
二、野指針和空指針樣例
接下來用一個簡單的樣例對照一下野指針和空指針的差別
1.首先。打開Xcode的內存管理調試開關,它能幫助檢測垃圾內存
2.自己定義Student類。在main函數中加入下列代碼
1 Student *stu = [[Student alloc] init]; 2 3 [stu setAge:10]; 4 5 [stu release]; 6 7 [stu setAge:10];
執行程序。你會發現第7行報錯了。是個野指針錯誤!
3.接下來分析一下報錯原因
1> 運行完第1行代碼後,內存中有個指針變量stu,指向了Student對象
Student *stu = [[Student alloc] init];
如果Student對象的地址為0xff43,指針變量stu的地址為0xee45。stu中存儲的是Student對象的地址0xff43。即指針變量stu指向了這個Student對象。
2> 接下來是第3行代碼
[stu setAge:10];
這行代碼的意思是:給stu所指向的Student對象發送一條setAge:消息,即調用這個Student對象的setAge:方法。眼下來說。這個Student對象仍存在於內存中。所以這句代碼沒有不論什麽問題。
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對象已經被銷毀了,它所占用的內存已經是垃圾內存,假設你還去訪問這一塊內存。那就會報野指針錯誤。這塊內存已經不可用了,也不屬於你了,你還去訪問它,肯定是不合法的。
所以。這行代碼報錯了。
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就不再指向不論什麽內存了
由於stu是個空指針。沒有指向不論什麽對象,因此第9行的setAge:消息是發不出去的,不會造成不論什麽影響。當然。肯定也不會報錯。
5.總結
1> 利用野指針發消息是非常危急的,會報錯。也就是說,假設一個對象已經被回收了,就不要再去操作它,不要再嘗試給它發消息。
2> 利用空指針發消息是沒有不論什麽問題的,也就是說以下的代碼是沒有錯誤的:
[nil setAge:10];
【Objective-C】09-空指針和野指針