iT邦幫忙

0

iOS APP 開發 OC 第十七天,內存管理&引用計數器(重要觀念)

tags: OC 30 day


開發一個項目,內存管理最直接影響一個項目的品質。意味著一個好的內存管理會讓項目的運行效率優良;反之,效能不好,還有可能導致項目崩潰。

內存管理是什麼?

內存的作用,就是儲存數據。

  1. 如何將數據儲存到內存當中。
  2. 當數據不再被使用的時候,佔用的內存空間如何被釋放。

如何將數據儲存到內存當中?

聲明一個變量,然後將數據儲存進去。

內存的五大區域

stack:

局部變量,當局部變量的作用預備執行完畢之後,這個局部變量就會被系統立即回收。

heap:

OC對象。使用C函數申請的動態空間。

BSS(Block Started by Symbol):

未初始化的全局變量,靜態變量。一但初始化就回收,並轉存到數據段之中。

數據段:

已經初始化的全局變量,靜態變量,直到程序結束得時候才會被回收。

代碼段:

代碼,程序結束得時候,系統會自動回收儲存在代碼段的數據。

stack,BSS,數據段,代碼段的數據回收是由系統自動完成的,不需要我們干預。

BSS是什麼?
因為宣告一段空間很快
而且又不是動態的
在程式一開始時就allocate一段空間
但是如果都要先初始化成某個值,那就消耗資源
如果你宣告了很多
卻都沒使用
那就浪費資源
所以,先畫出來範圍

分配在heap中的OC對象,是肯定要被回收的

iphone內存機制,如果一個APP佔用的內存超過40M,就會收到一個警告。45M,又會收到第二個警告。如果超過120M,APP就會直接閃退。

儲存在heap的OC對象,系統不會自動回收,直到程序結束時才會被回收。

我們要注意的是,Stack的記憶體回收,其他的系統會自動回收。

對象應該要什麼時候回收?

當有人在使用這個對象的時候,這個對象就不能回收。
只有在沒有任何人使用這個對象的時候,才可以回收。
那麼我們要如何知道這個對象有沒有人在使用呢。
我們今天的主角除來啦?

引用計數器

每一個對象都有一個屬性,叫做retainCount。叫做引用計數器。類型是unsigned long 佔據8個字節。引用計數器的作用:用來記錄當前這個對象有多少個人在使用它。

  1. 默認情況下,創建一個對象出來,這個對象的引用計數器的默認值是1。
  2. 當多一個人使用這個對象時,應該先讓這個對象的引用計數器加1,代表這個對象多一個人使用。
  3. 當這個對象少一個人使用的時候,應該讓這個對象的養用計數器減1,代表這個對象少一個人使用。
  4. 當這個對象的引用計數器變回0的時候。代表這個對象沒人使用。這個時候系統就會自動回收這個對象。

如何操作引用計數器?

  1. 為對象發送一條retain消息,對象的引用計數器就會加1 ,當多一個人使用對象的時候才會發。
  2. 為對象發送一條release消息,對象的引用計數器就會減1 ,當少一個人使用對象的時候才會發。
  3. 為對象方送一條retainCount消息,就可以去到對象的引用計數器的值。
  4. 當引用計數器變為0的時候,對象就會被系統立即回收。

在對象回收的時候,會自動調用對象的dealloc方法。

內存管理的分類

MRC:手動引用計數。

手動內存管理
當多一個人使用對象的時候,手動發送retain消息;少一個人使用時,手動發送release消息。

ARC:自動引用計數。

自動內存管理
系統自動在合適的地方發送retain與release消息。


尚未有邦友留言

立即登入留言