2011年11月27日 星期日

關於 Objective-C memory

兩個問題:
  1. 一個app在mobile device上使用了多少記憶體可能導致crash?
  2. 我們要如何看到我們的app使用記憶體的狀況?
在回答這兩個問題之前,再特別強調一個觀念:
在Objective-C裡面指的memory leak,只是產生了一個程式再也無法用任何方式回收的記憶體空間,其實它沒有那麼恐怖!(指的是它並非是造成crash的主因)」
為何我特別標註第一句話,因為在通用語言的定義中,指的是「沒有任何程式碼來回收的記憶體空間,都叫做memory leak」,事實上也是如此,真正恐怖的不是Objective-C指的memory leak,而是你沒有好好控管你的程式,導致一堆記憶體空間雖然可以用程式回收,但你卻沒有在適當的時機回收,這種memory leak,是你用xcode(Objective-C IDE)的Leaks工具也抓不出來的!
更詳細的memory leak的例子,可以參考這個連結http://www.shopify.com/technology/4321572-most-memory-leaks-are-good
這又回到了上面第二個問題,我們即便知道了記憶體在mobile device上是很珍貴的,但我們如果不知道自己寫的app是如何使用記憶體的,那我們又怎麼規劃最適當的記憶體使用方式?(xcode 4.2預設已經是ARC(Automatic Reference Counting),理論上並不會再出現Objective-C指的memory leak,但仍會出現通用語言定義的memory leak)
先回答第二個問題,其實xcode(instruments)內建的allocations工具就可以觀察記憶體使用狀況了。
再回到第一個問題,「一個app在mobile device上使用了多少記憶體可能導致crash
記憶體使用本來就是作業系統動態管理的,沒有「明確的指標」是正常的,但一定有所謂的理論危險值,而就我查到的資料,雖然沒有人給100%的肯定答案,不過仍有一些人有推論值(這部份可以隨著我們觀察的經驗,越來越精準):
  • iPhone3G:14MB進入危險邊緣、20MB肯定crashl
  • iPhone3GS:iOS改為更動態的分配記憶體,ram也較大(256mb),較不容易發生,有人推論是iPhone3G的四倍左右,也就是56-80MB
  • ipad:ram規格同上
  • iPhone4:沒查到相關資料,但總之iphone4的ram是512mb,然後作業系統iOS4~5大概佔1xx,我猜超過200mb就進入危險邊緣。
  • ipad2:ram規格同上

參考資源








沒有留言:

張貼留言