記憶體分割槽
簡述記憶體分割槽情況:
- 程式碼區:存放函式二進位制檔案程式碼;
- 資料區:存放靜態變數,常量,全域性變數;
- 棧區:由高地址向下開闢的一塊連續的記憶體空間,先進後出,所以不會有碎片問題,由編譯器控制釋放,無需手動釋放,因此更有效率,分為靜態分配(編譯器完成分配,如區域性變數)和動態分配(如alloc函式進行分配,由編譯器自動釋放)。棧的大小是編譯器自動分配的,所以如果申請的記憶體空間大於剩餘記憶體大小,會overflow。
- 堆區:由低地址向上的不連續記憶體空間,頻繁的new/delete會造成記憶體碎片,降低執行效率。堆需要手動釋放,回收記憶體。堆的記憶體空間更大,更靈活。
ps:oc中基本資料型別(int,double,float...)是在棧區,無需手動釋放,超過作用域自動釋放;物件(NSObject及其子類)是在堆區,需要手動釋放release,回收記憶體。
pps:這裡插一下,為什麼block要用copy修飾符,因為block本質上是程式碼塊,在棧區,為了防止生命週期結束自動被釋放需要copy到堆區。
Better Late Than Never!
努力是為了當機會來臨時不會錯失機會。
共勉!