一、內存五大區(qū)域:
1.棧(存儲局部變量)
2.堆(程序員手動申請的字節(jié)空間 malloc calloc realloc)
3.BSS段(存儲未被初始化的全局變量/靜態(tài)變量)
4.數據段(存儲已經被初始化的全局靜態(tài)變量 常量數據)
5.代碼段 (存儲代碼段)
二、類加載
1.在創(chuàng)建對象的時候,需要訪問類;
2.聲明1個類的指針變量也會訪問類;
在程序運行期間,當某個類第一次被訪問到的時候,會將這個類存儲到內存中的代碼段區(qū)域,這個過程叫類加載。
只有類在第一次訪問的時候,才會做類加載。
一旦類被加載到代碼段以后, 直到程序結束的時候才會被釋放。
3.對象在內存中究竟是如何存儲的
如:Person *p1 = [Person new];
1.) Person *p1;會在棧內存中申請1塊空間。在棧內存中聲明1個Person類型的指針變量p1.

p1是指針變量,那么只能存儲地址。
2.)[Person new];真正在內存中創(chuàng)建對象的是這句代碼。
new做的事情:
a.)在堆內存中申請1塊合適大小的空間。
b.)在這個空間中根據類的模板創(chuàng)建對象(類模板定義了什么屬性,就把這些屬性聲明在對象之中)。對象中還有另外一個屬性,叫isa是1個指針。這個指針指向在代碼段中類的地址。
c.)初始化對象的屬性。如果屬性的類型是基本類型,那么就賦值為0;如果屬性的類型是C語言的指針類型那么就賦值為NULL;如果屬性的類型是OC的指針類型,那么就賦值為nil。
d.)返回對象在堆中的地址


三、NULL與nil區(qū)別
1.NULL
只能作為指針變量的值,如果1個指針變量的值是NULL,代表這指針不指向內存中的任何1塊空間,NULL其實等價于0 NULL其實是一個宏,就是0
2.nil
只能作為指針變量的值,代表這個指針變量不指向內存中的任何空間
nil其實等價于0也是1個宏 就是0
所以NULL和nil其實是一樣的。
雖然使用NULL的地方可以使用nil,使用nil的地方可以使用NULL但是不建議隨便使用
C指針用NULL
int *p1 = NULL;//p1指針不指向內存中的任何對象
OC的類指針用nil
Person *p1 = nil; // p1指針不指向任何對象
如果1個類的指針的值為nil,代表這個指針不指向任何對象。那么這個時候,如果通過p1指針去訪問指向改對象的屬性,運行時會報錯。
四、多個指針指向同1個對象
Person *p1 = [[Person allocl] init];
Person *p2 = [[Person allocl] init];

五、分組導航標記
1.#pramamark分組名//就會在導航條對應的位置顯示1個標題
2.#pramamark-//就會在導航條對應的位置顯示1條水平分割線
3.#pramamark-分組名//就會在導航條對應的位置顯示一條分割線,再顯示標題
六、方法與函數的異同
相同點:都是用來封裝一段代碼,表示一個相對獨立的功能。函數和方法只要被調用,那么封裝在其中的代碼就會被自動執(zhí)行。
區(qū)別:1)語法不同 2)定義的位置不同3)調用方式不同。函數可以直接調用,方法需要先創(chuàng)建對象,再通過對象來調用方法
七、屬性
屬性的本質是變量
ps:吐槽一下,簡書還是沒有oneNote好用啊,圖片不能粘貼,只能一張一張上傳,有點麻煩。