1. 程式人生 > >野指標與殭屍物件

野指標與殭屍物件

  • 野指標.

    • C語言: 當我們宣告1個指標變數,沒有為這個指標變數賦初始值.這個指標變數的值是1個垃圾指 指向1塊隨機的記憶體空間。
    • OC語言: 指標指向的物件已經被回收掉了.這個指標就叫做野指標.
  • 殭屍物件

    • . 記憶體回收的本質.

      • 申請1塊空間,實際上是向系統申請1塊別人不再使用的空間.
      • 釋放1塊空間,指的是佔用的空間不再使用,這個時候系統可以分配給別人去使用.
      • 在這個個空間分配給別人之前 資料還是存在的.

        • OC物件釋放以後,表示OC物件佔用的空間可以分配給別人.
        • 但是再分配給別人之前 這個空間仍然存在 物件的資料仍然存在.
      • 殭屍物件: 1個已經被釋放的物件 就叫做殭屍物件.

    • . 使用野指標訪問殭屍物件.有的時候會出問題,有的時候不會出問題.

      • 當野指標指向的殭屍物件所佔用的空間還沒有分配給別人的時候,這個時候其實是可以訪問的.
      • 因為物件的資料還在.
      • 當野指標指向的物件所佔用的空間分配給了別人的時候 這個時候訪問就會出問題.

      • 所以,你不要通過1個野指標去訪問1個殭屍物件.

        • 雖然可以通過野指標去訪問已經被釋放的物件,但是我們不允許這麼做.
    • . 殭屍物件檢測.

      • 預設情況下. Xcode不會去檢測指標指向的物件是否為1個殭屍物件. 能訪問就訪問 不能訪問就報錯.
      • 可以開啟Xcode的殭屍物件檢測.
        • 那麼就會在通過指標訪問物件的時候,檢測這個物件是否為1個殭屍物件 如果是殭屍物件 就會報錯.
    • . 為什麼不預設開啟殭屍物件檢測呢?

      • 因為一旦開啟,每次通過指標訪問物件的時候.都會去檢查指標指向的物件是否為殭屍物件.
      • 那麼這樣的話 就影響效率了.
  • . 如何避免殭屍物件報錯.

    • 當1個指標變為野指標以後. 就把這個指標的值設定為nil
  • 殭屍物件無法復活.

    • 當1個物件的引用計數器變為0以後 這個物件就被釋放了.
    • 就無法取操作這個殭屍物件了. 所有對這個物件的操作都是無效的.

    • 因為一旦物件被回收 物件就是1個殭屍物件 而訪問1個殭屍物件 是沒有意義.