一、內(nèi)存五大區(qū)域:
1.棧(存儲局部變量)
2.堆(程序員手動申請的字節(jié)空間 malloc calloc realloc)
3.BSS段(存儲未被初始化的全局變量/靜態(tài)變量)
4.數(shù)據(jù)段(存儲已經(jīng)被初始化的全局靜態(tài)變量 常量數(shù)據(jù))
5.代碼段 (存儲代碼段)
二妖滔、類加載
1.在創(chuàng)建對象的時候座舍,需要訪問類;
2.聲明1個類的指針變量也會訪問類采蚀;
在程序運行期間承二,當(dāng)某個類第一次被訪問到的時候,會將這個類存儲到內(nèi)存中的代碼段區(qū)域璧眠,這個過程叫類加載责静。
只有類在第一次訪問的時候盖桥,才會做類加載。
一旦類被加載到代碼段以后揩徊, 直到程序結(jié)束的時候才會被釋放塑荒。
3.對象在內(nèi)存中究竟是如何存儲的
如:Person *p1 = [Person new];
1.) Person *p1;會在棧內(nèi)存中申請1塊空間彼硫。在棧內(nèi)存中聲明1個Person類型的指針變量p1.
p1是指針變量拧篮,那么只能存儲地址串绩。
2.)[Person new];真正在內(nèi)存中創(chuàng)建對象的是這句代碼礁凡。
new做的事情:
a.)在堆內(nèi)存中申請1塊合適大小的空間。
b.)在這個空間中根據(jù)類的模板創(chuàng)建對象(類模板定義了什么屬性把篓,就把這些屬性聲明在對象之中)纫溃。對象中還有另外一個屬性,叫isa是1個指針韧掩。這個指針指向在代碼段中類的地址紊浩。
c.)初始化對象的屬性。如果屬性的類型是基本類型疗锐,那么就賦值為0坊谁;如果屬性的類型是C語言的指針類型那么就賦值為NULL;如果屬性的類型是OC的指針類型滑臊,那么就賦值為nil口芍。
d.)返回對象在堆中的地址
三、NULL與nil區(qū)別
1.NULL
只能作為指針變量的值雇卷,如果1個指針變量的值是NULL鬓椭,代表這指針不指向內(nèi)存中的任何1塊空間,NULL其實等價于0 NULL其實是一個宏关划,就是0
2.nil
只能作為指針變量的值裤翩,代表這個指針變量不指向內(nèi)存中的任何空間
nil其實等價于0也是1個宏 就是0
所以NULL和nil其實是一樣的踊赠。
雖然使用NULL的地方可以使用nil,使用nil的地方可以使用NULL但是不建議隨便使用
C指針用NULL
int *p1 = NULL伦籍;//p1指針不指向內(nèi)存中的任何對象
OC的類指針用nil
Person *p1 = nil; // p1指針不指向任何對象
如果1個類的指針的值為nil,代表這個指針不指向任何對象利诺。那么這個時候立倍,如果通過p1指針去訪問指向改對象的屬性口注,運行時會報錯。
四策添、多個指針指向同1個對象
Person *p1 = [[Person allocl] init];
Person *p2 = [[Person allocl] init];
五、分組導(dǎo)航標(biāo)記
1.#pramamark分組名//就會在導(dǎo)航條對應(yīng)的位置顯示1個標(biāo)題
2.#pramamark-//就會在導(dǎo)航條對應(yīng)的位置顯示1條水平分割線
3.#pramamark-分組名//就會在導(dǎo)航條對應(yīng)的位置顯示一條分割線物臂,再顯示標(biāo)題
六棵磷、方法與函數(shù)的異同
相同點:都是用來封裝一段代碼泽本,表示一個相對獨立的功能规丽。函數(shù)和方法只要被調(diào)用,那么封裝在其中的代碼就會被自動執(zhí)行艘狭。
區(qū)別:1)語法不同 2)定義的位置不同3)調(diào)用方式不同。函數(shù)可以直接調(diào)用官撼,方法需要先創(chuàng)建對象傲绣,再通過對象來調(diào)用方法
七续搀、屬性
屬性的本質(zhì)是變量
ps:吐槽一下禁舷,簡書還是沒有oneNote好用啊榛了,圖片不能粘貼,只能一張一張上傳战坤,有點麻煩途茫。