close
在軟體的runtime,若是不妥善地管理記憶體,將可能導致memory leak,使得程式意外終止,
因此開發者必須熟悉與精確的使用這些記憶體管理方式。
在此,僅試著提供guideline與幾個需要注意的地方,詳細資訊以附加連結方便大家閱讀。
- Run loop
At a Glance:
所有的objects在runtime都是在run loop中運作,
在結束loop時,系統會進行drain的動作,
使得所有物件都得到適當的處理。
但有時使用者卻不想讓某些記憶體被回收,
例如:
某個method負責分配記憶體,並且回傳此記憶體給某個指標,
這時因為離開method之後,記憶體不歸於該method管理,該怎麼管理是個問題,
- 1.若是在該method中release,那回傳就會出現錯誤。
- 2.若是不做release動作,那什麼時候才需要release呢?
- 3.就物件丟進去autoreleasepool,由pool自行管理,是種解決方法。
- Manual Retain-Release
At a Glance:
所有自行使用alloc/copy/retain/new所建立的object,必須要自行release。
其實規則相當簡單,一次retain搭配一次release,只是程式碼一多就容易混淆。
可以將object呼叫autoreleasepool method,使之在run loops的適當時機得到release。
以下是你有責任去管控管的三種情況:
- 1.使用alloc。
- 2.使用copy(shallow/deep)所產生的object。
- 3.使用retain。
常犯錯誤例子:
- 1.Dangling pointers。
- 2.邏輯一複雜就不容易撰寫。
- Auto Release Counting
At a Glance:
Xcode 4.2+已經預設使用ARC。
ARC並不是一個新增加的代碼,而是利用編譯器在compile time,
為code增加retain/release/autorelease等keywords。
優點:
- 1.正因為是在compile time就已經決定物件何去何從,因此ARC比GC (runtime process)更有效率。
- 2.程式碼較少,更好理解,維護相對容易。
- 3.因為是compile進行管理,相對安全且穩定。
常犯錯誤例子:
- 1.retain cycle
- 2.注意C語言的pointers
參考資料:About Memory Management in Apple Developer
文章標籤
全站熱搜
留言列表