野指針與僵尸對(duì)象
1.
野指針
1>C語(yǔ)言中的野指針:一個(gè)指針變量指向一塊隨機(jī)的空間,這個(gè)指針就是野指針當(dāng)我們聲明一個(gè)指針變量的時(shí)候,沒(méi)有為這個(gè)指針變量賦值,那么這個(gè)指針變量里面的值是一個(gè)隨機(jī)的垃圾值.
2>OC中的野指針:指針指向的對(duì)象已經(jīng)被釋放,這個(gè)指針就叫做野指針僵尸對(duì)象:一個(gè)被釋放的對(duì)象,就叫做僵尸對(duì)象對(duì)象回收的本質(zhì):是對(duì)象占用的空間系統(tǒng)可以分配給別的對(duì)象在未被分配給別的程序之前,其實(shí)這個(gè)對(duì)象還在,數(shù)據(jù)也還在的.但是這塊空間隨時(shí)有可能分配給別的程序
3>僵尸對(duì)象:
3.1>內(nèi)存中的釋放機(jī)制:把一個(gè)對(duì)象銷毀掉,并不是把那個(gè)內(nèi)存空間給銷毀掉而是對(duì)象占用的空間可以分配給別的對(duì)象了在未被分配給別的對(duì)象之前,數(shù)據(jù)仍然是存在
3.2>僵尸對(duì)象一個(gè)已經(jīng)被釋放的對(duì)象,就叫做僵尸對(duì)象
3.3>通過(guò)野指針訪問(wèn)的對(duì)象就是僵尸對(duì)象有可能會(huì)出錯(cuò),也有可能不會(huì)出錯(cuò)當(dāng)僵尸對(duì)象占用的空間沒(méi)有分配給別的程序的時(shí)候,就不會(huì)報(bào)錯(cuò)4>所以,一旦一個(gè)指針成為野指針,就不要通過(guò)這個(gè)野指針去訪問(wèn)對(duì)象的成員了因?yàn)檫@個(gè)時(shí)候有很多未知
4>通過(guò)指針去訪問(wèn)一個(gè)對(duì)象的時(shí)候,Xcode默認(rèn)情況下不會(huì)去檢查這個(gè)對(duì)象是否為一個(gè)僵尸對(duì)象可以開(kāi)啟Xcode的僵尸對(duì)象的檢查這樣的話,每次通過(guò)一個(gè)指針去訪問(wèn)一個(gè)對(duì)象,都會(huì)去檢查這個(gè)對(duì)象是否為一個(gè)僵尸對(duì)象.如果是僵尸對(duì)象.立即報(bào)錯(cuò)如何開(kāi)啟僵尸對(duì)象實(shí)時(shí)檢測(cè)->run->editManager->run->
5>既然開(kāi)啟僵尸對(duì)象這么多好處,為什么不默認(rèn)開(kāi)啟?一旦開(kāi)啟僵尸對(duì)象,每次在使用這個(gè)指針訪問(wèn)對(duì)象的時(shí)候,都會(huì)檢查這個(gè)對(duì)象是否為一個(gè)僵尸對(duì)象.這樣會(huì)非常消耗性能
??? 如何避免使用僵尸對(duì)象在對(duì)象引用計(jì)數(shù)變?yōu)?的時(shí)候,給指針變量賦值nil
???? 不能讓一個(gè)僵尸對(duì)象復(fù)活
[p1 release];//
引用計(jì)數(shù)器為0,所以對(duì)象被釋放,p1是一個(gè)野指針,對(duì)象是個(gè)僵尸對(duì)象
[p1 retain];//
這句話是不可能將僵尸對(duì)象復(fù)活的,p1是一個(gè)野指針,通過(guò)野指針訪問(wèn)僵尸對(duì)象會(huì)報(bào)錯(cuò)