1.內(nèi)存管理的重要性
移動(dòng)設(shè)備的內(nèi)存極其有限,每個(gè)app所能占用的內(nèi)存是有限制的
-
下列行為都會(huì)增加一個(gè)app的內(nèi)存占用
- 創(chuàng)建一個(gè)OC對象
- 定義一個(gè)變量
- 調(diào)用一個(gè)函數(shù)或者方法
當(dāng)app所占用的內(nèi)存較多時(shí),系統(tǒng)會(huì)發(fā)出內(nèi)存警告,這時(shí)得回收一些不需要再使用的內(nèi)存空間。比如回收一些不需要使用的對象、變量等
如果app占用內(nèi)存過大, 系統(tǒng)可能會(huì)強(qiáng)制關(guān)閉app, 造成閃退現(xiàn)象, 影響用戶體驗(yàn)
2.什么是內(nèi)存管理
-
如何回收那些不需要再使用的對象?
- 那就得學(xué)會(huì)OC的內(nèi)存管理
-
所謂內(nèi)存管理, 就是對內(nèi)存進(jìn)行管理, 涉及的操作有:
- 分配內(nèi)存 : 比如創(chuàng)建一個(gè)對象, 會(huì)增加內(nèi)存占用
- 清除內(nèi)存 : 比如銷毀一個(gè)對象, 能減小內(nèi)存占用
-
內(nèi)存管理的管理范圍
- 任何繼承了NSObject的對象
- 對其他非對象類型無效(int、char、float、double、struct、enum等 )
-
只有OC對象才需要進(jìn)行內(nèi)存管理的本質(zhì)原因
- OC對象存放于堆里面
- 非OC對象一般放在棧里面(棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收)
3.堆和棧
棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧(先進(jìn)后出);
堆(操作系統(tǒng)):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收,分配方式類似于鏈表。
示例:
int main(int argc, const char * argv[])
{
@autoreleasepool {
int a = 10; // 棧
int b = 20; // 棧
// c : 棧
// Car對象(計(jì)數(shù)器==1) : 堆
Car *c = [[Car alloc] init];
}
// 經(jīng)過上一行代碼后, 棧里面的變量a\b\c都會(huì)被回收
// 但是堆里面的Car對象還會(huì)留在內(nèi)存中,因?yàn)樗怯?jì)數(shù)器依然是1
return 0;
}
棧和堆.png