? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1. 內(nèi)存中的五大區(qū)域.
棧: 存儲(chǔ)局部變量.
堆: 程序員手動(dòng)申請(qǐng)的字節(jié)空間 malloc calloc realloc函數(shù).
BSS段: 存儲(chǔ)未被初始化的全局變量 靜態(tài)變量.
數(shù)據(jù)段(常量區(qū)): 存儲(chǔ)已被初始化的全局 靜態(tài)變量 常量數(shù)據(jù).
代碼段: 存儲(chǔ)代碼. 存儲(chǔ)程序的代碼.
對(duì)象在內(nèi)存中存儲(chǔ)的過程:
Person *p1 = 【【Person alloc】init】痕檬;
1). Person *p1; 會(huì)在棧內(nèi)存中申請(qǐng)1塊空間. 在棧內(nèi)存中聲明1個(gè)Person類型的指針變量p1。
p1是1個(gè)指針變量.? 那么只能存儲(chǔ)地址.
2). [Person new]; 真正在內(nèi)存中創(chuàng)建對(duì)象的其實(shí)是這句代碼.
new做的事情
a. 在堆內(nèi)存中申請(qǐng)1塊合適大小的空間.(相當(dāng)于alloc)
b. 在這個(gè)空間中根據(jù)類的模板創(chuàng)建對(duì)象.
類模板中定義了什么屬性.就把這些屬性依次的聲明在對(duì)象之中.
對(duì)象中還有另外1個(gè)屬性 叫做isa 是1個(gè)指針. 指向?qū)ο笏鶎俚念愒诖a段中的地址.
c. 初始化對(duì)象的屬性? (相當(dāng)于init)
如果屬性的類型是基本數(shù)據(jù)類型 那么就賦值為0
如果屬性的類型是C語言的指針類型 那么就賦值為NULL
如果屬性的類型是OC的類指針類型 那么就賦值為nil
d. 返回對(duì)象的地址.
3). 注意
a. 對(duì)象中只有屬性,而沒有方法. 自己類的屬性外加1個(gè)isa指針指向代碼段中的類.
b. 如何訪問對(duì)象的屬性
指針名->屬性名;
根據(jù)指針 找到指針指向的對(duì)象 再找到對(duì)象中的屬性來訪問.
c. 如何調(diào)用方法.
[指針名 方法名];
先根據(jù)指針名找到對(duì)象,對(duì)象發(fā)現(xiàn)要調(diào)用方法 再根據(jù)對(duì)象的isa指針找到類.
然后調(diào)用類里的方法.
4. 為什么不把方法存儲(chǔ)在對(duì)象之中?
因?yàn)槊?個(gè)對(duì)象的方法的代碼實(shí)現(xiàn)都是一模一樣的? 沒有必要為每1個(gè)對(duì)象都保存1個(gè)方法 這樣的話就太浪費(fèi)空間了.
既然都一樣 那么就只保持1份.
5. 對(duì)象的屬性的默認(rèn)值.
如果我們創(chuàng)建1個(gè)對(duì)象,沒有為對(duì)象的屬性賦值. 那么這個(gè)對(duì)象的屬性是有值的.
如果屬性的類型是基本數(shù)據(jù)類型 默認(rèn)值是0
如果屬性的類型是C指針類型 那么默認(rèn)值是NULL
如果屬性的類型是OC指針類型? 那么默認(rèn)值是nil