題記
在了解OC對象在內(nèi)存的本質(zhì)后玛痊,那么我們進(jìn)一步思考绍绘,OC對象是怎么分類的呢因篇?每個類的作用苹威,以及之間的聯(lián)系又是怎么樣呢?
正題
Object-C中的對象簡稱OC對象办悟,主要分為以下3種:
- instance對象(實例對象)
- class對象(類對象)
- meta-class對象(元類對象)
那么這三種對象有什么不一樣呢?首先我們來看instance對象:
instance對象
instance對象是通過類用alloc方法創(chuàng)建出來的對象滩褥,每次調(diào)用alloc都會產(chǎn)生新的instance對象病蛉。首先我們定義一個JJPerson類
我們通過alloc方法來創(chuàng)建JJPerson的instance對象
如圖我們可以看到p1和p2是通過JJPerson的alloc方法創(chuàng)建出來的instance對象(實例對象),它們是兩個不同的對象瑰煎,有著不同的內(nèi)存地址铺然。
instance對象的內(nèi)容
- instance對象里面存放著isa指針以及成員變量
- isa排在首位,所以isa所指向的地址也是instance對象所在的地址
類對象
通過class方法獲取的酒甸,或者通過runtime的object_getClass方法都能獲取到類對象魄健,由于一個類對象在內(nèi)存中只有一份,所以我們可以看到插勤,無論哪個方法獲取到的內(nèi)存地址都是一樣的沽瘦。
類對象的內(nèi)容
由于類對象在整個內(nèi)存中只有一份,所以我們可以很容易聯(lián)想到农尖,那些在類中只需要一份的信息都會存儲在類對象中
- isa指針
- superClass指針
- 類的屬性信息(@property)析恋、對象方法信息(instance method)、協(xié)議信息(protocol)盛卡、成員變量信息(ivar)
meta-class對象:
元類對象是通過runtime的object_getClass方法獲取的助隧,和類對象不同的是,類對象獲取時需要傳入的參數(shù)是實例對象滑沧,而獲取元類對象時則要把類對象作為參數(shù)傳入并村。如下圖我們可以看到,元類對象在整個內(nèi)存中也只有一份滓技。
元類對象的內(nèi)容
- isa指針
- superClass指針
- 類的類方法信息
-
meta-class對象和class對象的內(nèi)存結(jié)構(gòu)是一樣的哩牍,但是用途不一樣
另外runtime還提供了一個class_isMateClass的方法來方便我們判斷,這個類是否是元類對象
疑問
每個對象都會有一個isa指針令漂,它是有什么用姐叁,每種對象之間又有什么關(guān)聯(lián)呢?我們下一篇繼續(xù)分析。