iOS-野指針與殭屍對象

 

  • 野指針.編輯器

  • C語言: 當咱們聲明1個指針變量,沒有爲這個指針變量賦初始值.這個指針變量的值是1個垃圾指 指向1塊隨機的內存空間。
  • OC語言: 指針指向的對象已經被回收掉了.這個指針就叫作野指針.

 

  • 殭屍對象 
      一個OC對象引用計數爲0被釋放後就變成殭屍對象了,殭屍對象的內存已經被系統回收,雖然可能該對象還存在,數據依然在內存中,但殭屍對象已是不穩定對象了,不能夠再訪問或者使用,它的內存是隨時可能被別的對象申請而佔用的
  • . 內存回收的本質.
  • 申請1塊空間,其實是向系統申請1塊別人再也不使用的空間.
  • 釋放1塊空間,指的是佔用的空間再也不使用,這個時候系統能夠分配給別人去使用.
  • 在這個個空間分配給別人以前 數據仍是存在的.
  • OC對象釋放之後,表示OC對象佔用的空間能夠分配給別人.
  • 可是再分配給別人以前 這個空間仍然存在 對象的數據仍然存在.
  • 殭屍對象: 1個已經被釋放的對象 就叫作殭屍對象.
      • . 使用野指針訪問殭屍對象.有的時候會出問題報錯(EXC_BAD_ACCESS),有的時候不會出問題.post

        • 當野指針指向的殭屍對象所佔用的空間尚未分配給別人的時候,這個時候實際上是能夠訪問的.由於對象的數據還在.
        • 當野指針指向的對象所佔用的空間分配給了別人的時候 這個時候訪問就會出問題. 因此,你不要經過1個野指針去訪問1個殭屍對象.spa

          • 雖然能夠經過野指針去訪問已經被釋放的對象,可是咱們不容許這麼作.
      • . 殭屍對象檢測.指針

        • 默認狀況下. Xcode不會去檢測指針指向的對象是否爲1個殭屍對象. 能訪問就訪問 不能訪問就報錯.
        • 能夠開啓Xcode的殭屍對象檢測. 
          • 那麼就會在經過指針訪問對象的時候,檢測這個對象是否爲1個殭屍對象 若是是殭屍對象 就會報錯.
      • . 爲何不默認開啓殭屍對象檢測呢?調試

        • 由於一旦開啓,每次經過指針訪問對象的時候.都會去檢查指針指向的對象是否爲殭屍對象.
        • 那麼這樣的話 就影響效率了.

 

  • . 如何避免殭屍對象報錯. 
      • 當1個指針變爲野指針之後. 就把這個指針的值設置爲nil

 

  • 殭屍對象沒法復活.
      • 當1個對象的引用計數器變爲0之後 這個對象就被釋放了.
      • 就沒法取操做這個殭屍對象了. 全部對這個對象的操做都是無效的.code

      • 由於一旦對象被回收 對象就是1個殭屍對象 而訪問1個殭屍對象 是沒有意義.    對象

 


 

  • 空指針 

    空指針是指沒有指向任何東西的指針(存儲的東西是nil、NULL、0),給空指針發送消息不會報錯blog

 


 

 

開啓Xcode對殭屍對象檢測調試

BAD_ACCESS 在什麼狀況下出現

BAD_ACCESS 報錯屬於內存訪問錯誤,會致使程序崩潰,錯誤的緣由是訪問了野指針(懸掛指針)。野指針指的是原本指針指向的對象已經釋放了,但指向該對象的指針沒有置 nil,指針指向隨機的未知的內存,程序還覺得該指針指向那個對象,致使存在一些潛在的危險訪問操做,這些危險訪問操做沒法被指針指向的未知內存所處理,就會致使BAD_ACCESS錯誤形成程序崩潰。訪問的含義包括多種狀況,例如:向野指針發送消息,讀寫野指針原本指向的對象的成員變量等等。圖片

如何調試BAD_ACCESS錯誤

首先調試BAD_ACCESS錯誤是比較困難的,咱們知道BAD_ACCESS錯誤是因爲訪問了野指針,但程序不會在野指針出現時或者在咱們訪問野指針的代碼處報錯,致使對其難以察覺,調試方法思路以下:內存

 

  • 開啓殭屍對象診斷

首先是開啓殭屍對象診斷模式,利用殭屍對象來對野指針的出現位置提供線索。咱們知道殭屍對象指的是引用計數爲0被系統回收的對象,但這些對象暫時還存在於內存中,且理論上仍是可使用的,可是不穩定。開啓殭屍對象診斷後,殭屍對象會暫時保持活躍用於調試,咱們的野指針在對象回收後依然指向該殭屍對象,在訪問野指針也就是訪問殭屍對象的狀況下能夠被編輯器檢測出來。這個時候仍是會報BAD_ACCESS錯誤,可是後臺會打印出該線索,例以下面的訪問野指針打印的後臺信息:

 

能夠看出Xcode告訴咱們消息發送給了一個殭屍對象,殭屍對象本來是一個實例,但如今該對象被回收了而開發者還試圖訪問它,由此能夠很容易定位問題所在。

另外開啓殭屍對象診斷的方法爲:打開Xcode頂部導航欄的Product-Scheme-Edit Scheme,在彈出的界面中選中左側的Run模式,而後勾選右側Dianostics下的Zombie Objects。

 

爲何不默認開啓殭屍對象檢測呢?

由於一旦開啓,每次經過指針訪問對象的時候,都會去檢查指針指向的對象是否爲殭屍對象。因此會影響程序的執行效率,建議關閉。

 

  • Analyze分析

殭屍對象診斷能夠幫助快速定位多數狀況下的野指針問題,但也有時候不能奏效,這個時候只能利用Xcode的Analyze靜態分析幫助檢查可能出問題的地方,仔細檢查問題所在,比較費時。

使用方法很簡單,選中Xcode頂部導航欄Product-Analyze或使用快捷鍵Command+Shift+B,分析須要花一些時間,而後左側會列出編輯器發現的存在潛在問題的地方,選中藍色圖標對應的問題項會跳到問題項所在的代碼行。但這隻能給出一些潛在提示,幫助搜索問題所在,不必定和咱們的bug相關。

這裏寫圖片描述

 

           定位到問題後把野指針至nil

 
 

用心去理解

相關文章
相關標籤/搜索