一、什么是類?
如果從數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō)。類其實(shí)就是升級(jí)版的結(jié)構(gòu)體,在C語(yǔ)言的機(jī)構(gòu)體中,只能定義屬性,但不能定義方法,而類的升級(jí),就是升級(jí)在,類不僅僅包含屬性,還可以定制方法,其實(shí)就是一個(gè)可以實(shí)現(xiàn)某種功能的方法和屬性的結(jié)合,例如可以定義一個(gè)分?jǐn)?shù)類,這個(gè)類中,有總成績(jī)、平均成績(jī)兩個(gè)屬性,有加法和平均法兩個(gè)方法,這就是一個(gè)類了,所以類的本質(zhì)就是結(jié)構(gòu)體,上一節(jié)也有例子進(jìn)行佐證。
二、類的加載和初始化
如下圖創(chuàng)建了三個(gè)類 person、student、animal三個(gè)類
類的加載:程序一運(yùn)行就會(huì)加載類的一部分
+(void)load
當(dāng)用到某個(gè)類的時(shí)候再加載全部,進(jìn)行初始化
+(void)initialize
二、類在內(nèi)存中的存儲(chǔ)
類在創(chuàng)建的過(guò)程中,是如何在內(nèi)存中存儲(chǔ)的?
我們就以下圖下圖創(chuàng)建person1對(duì)象為例
執(zhí)行該語(yǔ)句包含三部分 1.在代碼區(qū)中加載Person類的所有代碼 2在堆內(nèi)存中創(chuàng)建Person類的類對(duì)象 ,然后根據(jù)Person類的類對(duì)象創(chuàng)建person實(shí)例對(duì)象 3.把實(shí)例對(duì)象person在堆中的地址賦值給存儲(chǔ)在棧區(qū)的person1對(duì)象指針
其具體過(guò)程參照下圖
由此我們可以得出以下結(jié)論
1、類其實(shí)分為兩類
?????(1)類對(duì)象?
? ? ? ? ? ? ? ? 注意 :當(dāng)類被使用時(shí)每個(gè)類有且只有一個(gè)類對(duì)象
? ? ? ? ? ? ? ? ? ? ? ? ? ? 既然是“對(duì)象”,就有類型 其類型就是Class類型?
? ? ? ? ? ? ? ? ? ? ? ? ? ? 所有的實(shí)例對(duì)象的isa都指向了“類對(duì)象”,類對(duì)象存儲(chǔ)類類中
? ? ? ? ? ? ? ? ? ? ? ? ? ? 所有方法的函數(shù)指針(SEL),SEL 是一種專門存儲(chǔ)函數(shù)指針的數(shù)據(jù)類型
? ? ?(2)實(shí)例對(duì)象?
? ? ? ? ? ? ? ? 注意:通過(guò)類對(duì)象創(chuàng)建實(shí)例對(duì)象,
????????????????????????????這個(gè)實(shí)例對(duì)象存儲(chǔ)了類中的所有成員變量?
? ? ? ? ? ? ? ? ? ? ? ? ? ? 每個(gè)實(shí)例對(duì)象中都包含isa指針,這個(gè)指針指向該類的類對(duì)象
談?wù)劯形颍浩鋵?shí)我們可以類比一下結(jié)構(gòu)體
一.定義
1、 struct student{
int ?age;
}
2、類對(duì)象 Person
二、使用
struct student goodStudent;
Person *person = [Person alloc]init];
2、類、類對(duì)象、實(shí)例對(duì)象、方法、屬性在內(nèi)存中的存儲(chǔ)
類:存儲(chǔ)在代碼區(qū)
類對(duì)象、實(shí)例對(duì)象、屬性 存儲(chǔ)在堆區(qū)
代表方法的函數(shù)指針存儲(chǔ)在類對(duì)象中,也就是堆區(qū)中
3、分析類和類對(duì)象分開(kāi)以及類對(duì)象和實(shí)例對(duì)象分開(kāi)的好處
類代碼存儲(chǔ)在代碼區(qū):如果方法跟著類對(duì)象或者實(shí)例對(duì)象那就會(huì)占用堆中的很大空間
類對(duì)象:類對(duì)象創(chuàng)建一個(gè),實(shí)例對(duì)象就不會(huì)都存儲(chǔ)函數(shù)指針,只要想用是根據(jù)isa指針找到對(duì)應(yīng)的類對(duì)象
然后根據(jù)對(duì)應(yīng)的SEL找到存儲(chǔ)在代碼區(qū)中類的對(duì)應(yīng)方法的代碼段執(zhí)行
這樣分開(kāi)都會(huì)節(jié)省很多內(nèi)存
4.實(shí)例對(duì)象中的isa指針指向自己的類對(duì)象,自己類對(duì)象的isa指針指向了內(nèi)存中類代碼 如下圖所示,
執(zhí)行方法時(shí),是到類方法中的方法列表中尋找,KVO原來(lái),isa指針指向誰(shuí)就到那個(gè)類對(duì)象中找對(duì)應(yīng)的方法
kvo證明 1 runtime可以動(dòng)態(tài)添加類?
? ? ? ? ? ? ?? 2 動(dòng)態(tài)綁定方法? 改變isa
????