1. 內存管理.
1). 當數據需要被存儲的時候,如何存儲到內存之中.
聲明1個變量就可以了.將數據往這個變量中存儲就可以了.
2). 當存儲在內存中的數據不再需要被使用的時候,如何被回收.
2. 內存中的五大區域.
棧: 局部變量. 局部變量所在的作用域被執行完畢之后,就會被系統立即回收.
堆: OC對象以及我們手動申請的空間,使用malloc calloc。在堆內存中申請的空間.當我們不需要使用的時候.使用free函數來回收.
BSS段: 未經初始化的全局變量、靜態變量. 一旦被初始化以后,就會回收并轉存到數據段.
數據段: 已經初始化的全局變量、靜態變量、常量數據. 直到程序結束的時候才會被系統回收.
代碼段: 代碼數據.直到程序結束的時候才會被回收.
3. 存儲在在堆中的OC對象.
1). 存儲在堆中的OC對象,是肯定需要被回收的.
iPhone:
40M: 發送1條警告.
45M: 發送1條警告.
120M: 系統直接將程序閃退.
4. 內存管理的范圍:
除開堆以外的空間,他們中存儲的數據的回收,不需要程序員去手動管理.而是由系統自動回收的.
存儲在堆中的數據不再使用的時候,需要程序員手動的回收.否則存儲在堆中的對象直到程序結束的時候才會回收.
一旦存儲在堆內存中的對象不再需要被使用的時候,就應該立即回收它.
所以,我們只需要管存儲在堆中的OC對象的回收.
5. 對象什么時候應該被回收?
當對象不再有人使用的時候,那么就應該回收這個對象.
對象的擁有者:
誰在使用這個對象誰就是這個對象的擁有者.
那1個指針在指向這個對象,這個指針就是這個對象的擁有者.
當有人在使用這個對象的時候,這個對象不能被回收.
只有當沒有任何人在使用這個對象的時候,這個對象才可以被回收.
6. 如何知道對象有多少個人在使用它.
蘋果為每1個對象設計了1個屬性,叫做retainCount引用計數器.
unsigned long類型占據8個字節.
這個屬性的值代表有多少個人正在使用這個對象.
當多1個人使用這個對象的時候,應該先讓這個對象的引用計數器的值+1 代表多1個人使用這個對象
當少1個人使用這個對象的時候,應該先讓這個對象的引用計數器的值-1 代表少1個人使用這個對象.
當對象的引用計數器的值為0的時候,代表這個對象無人使用.那么這個時候系統就會立即回收這個對象.
在對象被系統回收的時候,會自動的對象的dealloc方法.
7. 操作對象的引用計數器.
1). 為對象發送1條retain消息.這個對象的引用計數器就會加1.
2). 為對象發送1條release消息.這個對象的引用計數器就會減1.
3). 為對象發送1條retainCount消息.就可以得到這個對象的引用計數器的值.
當對象的引用計數器的值變為0的時候.系統就會立即回收這個對象.
我們新創建的1個對象,這個對象的引用計數器的值默認是1.
8. 內存管理的分類.
MRC:Manual Reference Counting 手動引用計數
當多1個人使用對象的時候,程序手動的的為這個對象的引用計數+1.
當少1個人使用對象的時候程序員手動的為這個對象的引用計數器-1
手動內存管理.
ARC:Automatic Reference Counting 自動引用計數.
系統自動的為對象發送retain、release消息.