當我們對於記憶體進行手動管理的時候,會出現兩種錯誤:一種是野指標錯誤,一種則為記憶體洩露.這兩點也是我們去管理記憶體時最終要解決的問題.
記憶體洩漏是指:不在使用的物件,一直保留在記憶體中未被銷毀,一直占有著記憶體,耗費記憶體資源直至程式結束.
野指標則是指:當乙個指標指向乙個物件時,此物件已經被系統**.然後當再次通過該指標去操作物件時,則會出現野指標錯誤.而當系統**該物件時,並不會立即銷毀,而此時,該物件則成為殭屍物件.
在開發過程中,有人可能發現,有時殭屍物件也能訪問.這是為什麼呢?主要原因是因為xcode為了提高編碼效率,並不會實時監測殭屍物件.所以也就意味著它依然留在記憶體,所以造成"物件被銷毀後依然可以通過指標進行訪問"的假象.
那麼,怎樣解決這個問題呢?很簡單,只需要在xcode中設定實時監測殭屍物件就可以了具體步驟如下:
edit scheme --- diagnostics --- 勾選enable zombie objects 即可.
但這樣會比較耗效能,導致編譯時間延長.
接下來,簡單介紹下殭屍物件的銷毀過程:
假如乙個物件person,其retaincount值為1,此時執行[person release],則會有如下過程
1,判斷retaincount - 1 == 0 (注意,此時物件依然存在,並未成為殭屍物件,而retaincount也未被真正減一)
2,進入該類dealloc方法
3,在dealloc方法中如果呼叫了[super dealloc],則此時物件retaincount == 0,該物件也成為殭屍物件.
4,注意,如果沒有呼叫[super dealloc]方法,那麼該物件不會成為殭屍物件,其retaincount也不會減一.也就等於[person release]沒有效果.
殭屍物件細節:1,向其傳送訊息,會出現野指標錯誤
2,如果在其類內部,可以通過成員變數名(位址)繼續訪問其成員屬性,修改其值
OC物件記憶體管理
objective c物件記憶體管理 1,管理範圍 任何繼承了nsobject的物件,基本資料型別 int,char,float,double,struct,enum等 是不需要管理記憶體的。2,引用計數器 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 既有多少人正在使用這個...
OC物件記憶體管理
nsobject a nsobject alloc init 這時候在堆中分配一塊記憶體,並在棧中建立變數a指標,並將在堆中分配的記憶體起始位址賦值給這個指標a 這樣棧中的指標a就指向了堆中的物件。通過a可以訪問堆中物件。ios物件在arc下是編譯器做記憶體管理,在適當的地方插入relase 當自動...
Oc 記憶體管理
1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...