記憶體管理
程式是在記憶體中進行運作的,那麼它将會占用記憶體空間,而且随着程式的運作,記憶體占用會不斷增加.如果沒有一套完善記憶體管理機制,記憶體會随着程式的運作而會被耗盡,會導緻程式崩潰.
1.C語言:在C語言中,如果程式員用
malloc
或
calloc
函數開辟了記憶體空間,那麼程式員需要在适當的時候調用
free
函數進行釋放,這種規則是完全靠程式員的實力.
2.Java語言/C#語言:它們有垃圾回收機制,程式員隻用管開辟記憶體空間,而不用管釋放記憶體空間.
3.Object-C語言/C++語言:他們也是需要程式員手動管理記憶體的,也是靠程式員實力.
對于
Object-C
來說,雖然它需要程式員手動管理記憶體,但是它引入了一個機制友善程式員管理,這種機制叫做
引用技數
.
随着發展,蘋果公司為了減輕開發人員的負擔,又引入了另外一種機制,即類似于垃圾回收機制,意味着使用這種機制,開發人員
基本上
不需要關心記憶體的釋放.
對于OC中以上兩種記憶體管理方法,我們分别叫做
手動管理記憶體
和
自動管理記憶體
,英文簡稱分别為:
MRC
和
ARC
.
我們XCode在5.0版本以後,我們開發的程式預設都是
自動管理記憶體
,這種方式也是蘋果公司推薦方式.
手動管理記憶體 MRC
對象的生命周期
當一個執行個體對象由類執行個體化出來後,,就代表這個對象的産生;當不用此執行個體對象時,我們需要将此對象銷毀.對象的産生到銷毀,就代表對象的生命周期.
引用計數
在手動管理記憶體的時候,OC語言為開發者提供了一種友善管理記憶體機制,即引用計數,此機制為每一個對象配置設定一個
引用計數器
.
當一個對象産生時,
引用計數器
為此對象的
引用計數
指派為
1
.
當一個對象銷毀時,
引用計數器
為此對象的
引用計數
指派為
.(了解為
,實際上是
1
)
當程式員在手動管理對象的記憶體時,一些方法會引起
引用計數
的改變.
在OC中,用
retainCount
屬性來表示一個對象的引用技術.
改變引用技術的方法
1.對象初始化時,對象的引用技術為
1
,即
alloc
,
new
方法可以改變引用技術,即将對象的引用技數為
1
.
2.使用
retain
方法可以将對象的目前引用計數加1;
3.使用
release
方法可以将對象的目前引用計數減1;
4.使用
retain
方法構造出的對象和原對象是相同的對象;
5.使用
copy
方法構造出的對象是原有對象的副本,使副本對象的引用質數變為1.原有對象保持引用計數不變.
note
:對不可變對象的
copy
除外.
利用引用計數來做記憶體管理
對類的記憶體管理
1.誰建立,誰釋放,
alloc
,
new
的和與
release
的個數相等.
2.将一個對象
retain
,産生出一個新的對象,此新對象也可以釋放原有對象.
3.将一個對象指派給另一個對象,此新對象沒有拿到對象的所有權,不能夠釋放掉所有對象.
對類裡的屬性的記憶體管理
在一個類中,我們用
dealloc
方法對類的屬性進行記憶體管理.
對于
dealloc
方法,此方法是在料銷毀時,自動被調用,而不是被開發者調用 .
在
dealloc
方法中,我們用
_
+
屬性名
來調用
release
方法來釋放屬性.
類的對象放到集合當中引用計數的改變
1.将一個對象放到集合中,其引用計數加1;
2.當集合對象被銷毀掉,其内元素也被釋放掉;
3.将一個對象放到集合當中,其對象的釋放權就交給了目前集合對象,其記憶體管理就由目前集合對象來操作.
特别
NSString *string = @"ssss";
[string retain];
NSLog("string = %ld",string.retainCount);
@autoreleasepool和autorelease的使用
1.什麼時候使用
autorelease
:
當一個對象産生時,而無法判斷其什麼時候不使用,此時就可以對此對象發送
autorelease
消息.
2.當向一個對象發達了
autorelease
消息時,該對象就會在其最近的一個自動釋放池
autorelease
釋放.
3.不要随便一個對象就用
autorelease
釋放