【Objective-C】09-null 指標和野指標

來源:互聯網
上載者:User

標籤:

本文目錄
  • 一、什麼是null 指標和野指標
  • 二、野指標和null 指標例子

說明:這個Objective-C專題,是學習iOS開發的前奏,也為了讓有物件導向語言開發經驗的程式員,能夠快速上手Objective-C。如果你還沒有編程經驗,或者對Objective-C、iOS開發不感興趣,請忽略。學習本專題之前,建議先學習C語言專題。

回到頂部一、什麼是null 指標和野指標1.null 指標

1> 沒有儲存任何記憶體位址的指標就稱為空白指標(NULL指標)

2> null 指標就是被賦值為0的指標,在沒有被具體初始化之前,其值為0。

下面兩個都是null 指標:

1 Student *s1 = NULL;2 3 Student *s2 = nil;

 

2.野指標

"野指標"不是NULL指標,是指向"垃圾"記憶體(不可用記憶體)的指標。野指標是非常危險的。

 

回到頂部二、野指標和null 指標例子

接下來用一個簡單的例子對比一下野指標和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變成了null 指標,stu就不再指向任何記憶體了

因為stu是個null 指標,沒有指向任何對象,因此第9行的setAge:訊息是發不出去的,不會造成任何影響。當然,肯定也不會報錯。

 

5.總結

1> 利用野指標發訊息是很危險的,會報錯。也就是說,如果一個對象已經被回收了,就不要再去操作它,不要再嘗試給它發訊息。

2> 利用null 指標發訊息是沒有任何問題的,也就是說下面的代碼是沒有錯誤的:

[nil setAge:10];

【Objective-C】09-null 指標和野指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.