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