Objective C內存管理的核心思想

剛從其餘開發語言轉到mac開發上的工程師,對蘋果release/retain機制都有些不適應,若是你以前用c寫過python模塊,就沒有什麼障礙:python

Py_DECREFios

Py_DECREF程序員

也是同樣的效果算法

在llvm引入ARC機制以後,基本上不須要你們手寫release/retain了,只有在對象property聲明的時候還會出現retain。須要強調的是:ARC是編譯器的自動代碼生成功能,並非自動垃圾回收。ARC並非放棄release/retain計數機制,只是不須要程序員手寫,編譯器幫你自動插入相關代碼。編程

Objective C全部對象都是創建在heap上,聲明的變量都是指針,C++能夠在棧上分配一個object,這裏的堆和棧不是算法數據結構上的通用概念,是特指程序運行時的特定內存區域,stack在函數返回時,數據會被自動倒序清除,heap中的對象的銷燬由程序員決定數組

對象都是創建heap上有3個好處:服務器

  • 能夠加快編譯速度,這是delphi當初的一個大賣點數據結構

  • 優化性能/減低程序員寫錯代碼的概率,在函數中new一個object並返回,若是這個對象創建在stack上,後續就會出現零指針訪問錯誤編程語言

  • 把object集中放置能夠優化內存管理,這個是很天然的,現代編程語言都會對 諸如小對象分配作優化函數

Objective C的release/retain 核心在於蘋果工程師的工程哲學: 零指針訪問比內存泄露更可怕

  • 這條哲學說明ios的設計者有很是豐富的工程經驗:零指針訪問程序必然掛掉,這是cpu控制的。內存泄露並非漏氣漏水,其實上是內存佔用速度超過內存釋放速度,除非極端狀況,基本上影響不大,並不致命,實在不行,重啓一次程序就能夠,網遊服務器按期要停機維護就是這個緣由

  • 理解release/retain 機制:每一個對象有一個計數器,retain加一,release減一,計數器減到0,再銷燬對象並釋放內存

  • 把對象A交給對象B,若是B須要確保A的一直可用,那麼就須要對A執行一次retain

  • 例如:把 一個NSObject 放入到到一個 NSArray裏面,retain一次以後,不管NSObject何時被release(固然只能release一次),NSArray保存的對象指針指向的NSObject是不會被真正銷燬的,你遍歷這個數組的時候,還能夠用,不會出現bad pointer錯誤

  • 一樣的,一個對象若是定義了一個property是retain的,那說明它很在乎這個property,須要這個property一直伴隨該對象

  • 說簡單點,release/retain機制就是在於:你是個人一部分,我須要你的時候 對象別被銷燬了,要確保這點,retain之。

因此release/retain的用法訣竅在於:retain調用次數多點不礙事,你拿不許的狀況均可以retain,後果無外乎多佔用點系統內存

相關文章
相關標籤/搜索