close

在軟體的runtime,若是不妥善地管理記憶體,將可能導致memory leak,使得程式意外終止,

因此開發者必須熟悉與精確的使用這些記憶體管理方式。


在此,僅試著提供guideline與幾個需要注意的地方,詳細資訊以附加連結方便大家閱讀。

  • Run loop

At a Glance:

所有的objects在runtime都是在run loop中運作,

在結束loop時,系統會進行drain的動作,

使得所有物件都得到適當的處理。

但有時使用者卻不想讓某些記憶體被回收,

例如:

某個method負責分配記憶體,並且回傳此記憶體給某個指標,

這時因為離開method之後,記憶體不歸於該method管理,該怎麼管理是個問題,

  1. 1.若是在該method中release,那回傳就會出現錯誤。
  2. 2.若是不做release動作,那什麼時候才需要release呢?
  3. 3.就物件丟進去autoreleasepool,由pool自行管理,是種解決方法。
  • Manual Retain-Release

At a Glance:

所有自行使用alloc/copy/retain/new所建立的object,必須要自行release。

其實規則相當簡單,一次retain搭配一次release,只是程式碼一多就容易混淆。

可以將object呼叫autoreleasepool method,使之在run loops的適當時機得到release。

以下是你有責任去管控管的三種情況:

  1. 1.使用alloc。
  2. 2.使用copy(shallow/deep)所產生的object。
  3. 3.使用retain。

常犯錯誤例子:

  1. 1.Dangling pointers。
  2. 2.邏輯一複雜就不容易撰寫。
  • Auto Release Counting

At a Glance:

Xcode 4.2+已經預設使用ARC。

ARC並不是一個新增加的代碼,而是利用編譯器在compile time,

為code增加retain/release/autorelease等keywords。

優點:

  1. 1.正因為是在compile time就已經決定物件何去何從,因此ARC比GC (runtime process)更有效率。
  2. 2.程式碼較少,更好理解,維護相對容易。
  3. 3.因為是compile進行管理,相對安全且穩定。

常犯錯誤例子:

  1. 1.retain cycle
  2. 2.注意C語言的pointers

 

參考資料:About Memory Management in Apple Developer

 

 

 

 

 

 

arrow
arrow

    Ernest 發表在 痞客邦 留言(0) 人氣()