野指標與殭屍物件
阿新 • • 發佈:2019-01-27
野指標.
- C語言: 當我們宣告1個指標變數,沒有為這個指標變數賦初始值.這個指標變數的值是1個垃圾指 指向1塊隨機的記憶體空間。
- OC語言: 指標指向的物件已經被回收掉了.這個指標就叫做野指標.
殭屍物件
. 記憶體回收的本質.
- 申請1塊空間,實際上是向系統申請1塊別人不再使用的空間.
- 釋放1塊空間,指的是佔用的空間不再使用,這個時候系統可以分配給別人去使用.
在這個個空間分配給別人之前 資料還是存在的.
- OC物件釋放以後,表示OC物件佔用的空間可以分配給別人.
- 但是再分配給別人之前 這個空間仍然存在 物件的資料仍然存在.
殭屍物件: 1個已經被釋放的物件 就叫做殭屍物件.
. 使用野指標訪問殭屍物件.有的時候會出問題,有的時候不會出問題.
- 當野指標指向的殭屍物件所佔用的空間還沒有分配給別人的時候,這個時候其實是可以訪問的.
- 因為物件的資料還在.
當野指標指向的物件所佔用的空間分配給了別人的時候 這個時候訪問就會出問題.
所以,你不要通過1個野指標去訪問1個殭屍物件.
- 雖然可以通過野指標去訪問已經被釋放的物件,但是我們不允許這麼做.
. 殭屍物件檢測.
- 預設情況下. Xcode不會去檢測指標指向的物件是否為1個殭屍物件. 能訪問就訪問 不能訪問就報錯.
- 可以開啟Xcode的殭屍物件檢測.
- 那麼就會在通過指標訪問物件的時候,檢測這個物件是否為1個殭屍物件 如果是殭屍物件 就會報錯.
. 為什麼不預設開啟殭屍物件檢測呢?
- 因為一旦開啟,每次通過指標訪問物件的時候.都會去檢查指標指向的物件是否為殭屍物件.
- 那麼這樣的話 就影響效率了.
. 如何避免殭屍物件報錯.
- 當1個指標變為野指標以後. 就把這個指標的值設定為nil
殭屍物件無法復活.
- 當1個物件的引用計數器變為0以後 這個物件就被釋放了.
就無法取操作這個殭屍物件了. 所有對這個物件的操作都是無效的.
因為一旦物件被回收 物件就是1個殭屍物件 而訪問1個殭屍物件 是沒有意義.