【Objective-C】09-空指針和野指針

一、什么是空指針和野指針

1.空指針

1> 沒有存儲任何內存地址的指針就稱為空指針(NULL指針)
2> 空指針就是被賦值為0的指針,在沒有被具體初始化之前,其值為0。
Student *s1 = NULL;
Student *s2 = nil;

2.野指針

"野指針"不是NULL指針,是指向"垃圾"內存(不可用內存)的指針。野指針是非常危險的。
二、野指針和空指針例子
1.首先,打開Xcode的內存管理調試開關,它能幫助檢測垃圾內存



2.自定義Student類,在main函數中添加下列代碼
Student *stu = [[Student alloc] init];
[stu setAge:10];
[stu release];
[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];

轉載:http://www.cnblogs.com/mjios/archive/2013/04/22/3034788.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.空指針 1>沒有存儲任何內存地址的指針就稱為空指針(NULL指針) 2>空指針就是賦值為0的指針,在沒有被具體...
    zhaihongxia閱讀 698評論 0 0
  • 一些基礎的知識,經常混淆,特整理下 空指針: 1. 沒有存儲任何內存地址的指針就稱為空指針(NULL指針)。 2....
    劉應閱讀 5,742評論 4 20
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,776評論 0 9
  • “子非魚焉知魚之樂?!?每當面對主流價值觀的評價或者關心時,我會用這句話來為自己鼓氣。是呀,我覺得自己過得還不錯,...
    dolin閱讀 217評論 0 1