類加載

一、內存五大區(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好用啊,圖片不能粘貼,只能一張一張上傳,有點麻煩。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容