iOS底層原理總結(jié) - OC對象的分類

iOS底層原理總結(jié) - OC對象的分類

  • Objective-C中的對象, 簡稱OC對象, 主要可以分為3種
    • instance對象(實(shí)例對象)
    • class對象(類對象)
    • meta-class對象(元類對象)

一展蒂、instance

  • instance對象就是通過類alloc出來的對象, 每次調(diào)用alloc都會產(chǎn)生新的instance對象
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

NSLog(@"obj1 - %p", obj1);      // 打印: obj1 - 0x100500e90
NSLog(@"obj2 - %p", obj2);      // 打印: obj2 - 0x1005061b0
  • obj1锰悼、obj2NSObjectinstance對象(實(shí)例對象), 它們是不同的兩個對象箕般,分別占據(jù)著兩塊不同的內(nèi)存

  • instance對象在內(nèi)存中存儲的信息包括

    • isa指針
    • 其他成員變量
  • 例如, 一個Person類, 繼承自NSObject, 有一個_age的成員變量

@interface Person: NSObject {
    @public
    int _age;
}
@end
@implementation Person
@end
  • 創(chuàng)建Person類的instance對象, 并給成員變量_age賦值
Person *p1 = [[Person alloc] init];
p1->_age = 3

Person *p2 = [[Person alloc] init];
p2->_age = 4
  • 因為p1p2是兩個alloc創(chuàng)建的對象, 所以在內(nèi)存中分別占用一塊內(nèi)存, 類似于下圖
image.png

二曲初、class

  • class類對象, 可以通過alloc創(chuàng)建出instance對象
  • 有三種方式, 可以獲取一個類對象
    • - (Class)class
    • + (Class)class
    • object_getClass(實(shí)例對象)
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
// - (Class)class
Class objectClass1 = [obj1 class];
Class objectClass2 = [obj2 class];
// + (Class)class
Class objectClass3 = [NSObject class];
// object_getClass(實(shí)例對象)
Class objectClass4 = object_getClass(obj1);
Class objectClass5 = object_getClass(obj2);
  • objectClass1 ~ objectClass5都是NSObjectclass對象(類對象)
  • 它們是同一個對象, 每個類在內(nèi)存中有且只有一個class對象, 可以通過打印內(nèi)存證明:
NSLog(@"%p %p %p %p %p",
      objectClass1,
      objectClass2,
      objectClass3,
      objectClass4,
      objectClass5);
// 打印結(jié)果: 0x7fff955aa140 0x7fff955aa140 0x7fff955aa140 0x7fff955aa140 0x7fff955aa140
  • 通過打印結(jié)果可以證明, objectClass1 ~ objectClass5指向這同一塊內(nèi)存地址, 即在內(nèi)存中會存在一個類的class對象

  • class對象在內(nèi)存中存儲的信息主要包括:

    • isa指針
    • superclass指針
    • 類的屬性信息(@property)
    • 類的對象方法信息(instance method)
    • 類的協(xié)議信息(protocol)
    • 類的成員變量信息(ivar, 描述成員變量的類型和名字, 而不是如同實(shí)例一般具體的值)
    • ...
  • 如下圖:

image.png

三、meta-class

  • 每個類在內(nèi)存中有且只有一個meta-class對象
  • 可以通過運(yùn)行時的object_getClass(類對象)方法獲取類的元類型
// Runtime API
Class objectMetaClass = object_getClass([NSObject class]); 
  • objectMetaClassNSObjectmeta-class對象(元類對象)

  • meta-class對象和class對象的內(nèi)存結(jié)構(gòu)是一樣的颁褂,但是用途不一樣,在內(nèi)存中存儲的信息主要包括:

    • isa指針
    • superclass指針
    • 類的類方法信息(class method)
image.png

注意: meta-class對象class對象擁有相同的結(jié)構(gòu), 意思如下圖

image.png

class對象中, 類方法信息為空, meta-class方法中屬性信息對象方法信息惨缆、協(xié)議信息坯墨、成員變量信息為空

注意: - (Class)class+ (Class)class方法只能獲取class對象, 不能獲取meta-class對象
meta-class對象只能通過Runtimeobject_getClass(類對象)獲取

  • 可以通過Runtimeclass_isMetaClass(對象)函數(shù), 來判斷對象是否是元類型
Class objectClass = [NSObject class];
NSLog(@"%d", class_isMetaClass(objectClass));           // 打印: 0

Class objectMetaClass = object_getClass([NSString class]);
NSLog(@"%d", class_isMetaClass(objectMetaClass));       // 打印: 1
  • 下面是objc_getClass捣染、object_getClass停巷、- (Class)class畔勤、+ (Class)class的區(qū)別
 1.Class objc_getClass(const char *aClassName)
 1> 傳入字符串類名
 2> 返回對應(yīng)的類對象

 2.Class object_getClass(id obj)
 1> 傳入的obj可能是instance對象、class對象式曲、meta-class對象
 2> 返回值
 a) 如果是instance對象缸榛,返回class對象
 b) 如果是class對象内颗,返回meta-class對象
 c) 如果是meta-class對象,返回NSObject(基類)的meta-class對象

 3.- (Class)class恨溜、+ (Class)class
 1> 返回的就是類對象

 - (Class) {
     return self->isa;
 }

 + (Class) {
     return self;
 }

參考文章:原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筒捺,一起剝皮案震驚了整個濱河市纸厉,隨后出現(xiàn)的幾起案子颗品,更是在濱河造成了極大的恐慌,老刑警劉巖则吟,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓仲,死亡現(xiàn)場離奇詭異得糜,居然都是意外死亡敬扛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門朝抖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啥箭,“玉大人,你說我怎么就攤上這事治宣〖苯模” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵侮邀,是天一觀的道長坏怪。 經(jīng)常有香客問我,道長绊茧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任按傅,我火速辦了婚禮捉超,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唯绍。我一直安慰自己拼岳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布况芒。 她就那樣靜靜地躺著惜纸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绝骚。 梳的紋絲不亂的頭發(fā)上耐版,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音压汪,去河邊找鬼粪牲。 笑死,一個胖子當(dāng)著我的面吹牛止剖,可吹牛的內(nèi)容都是我干的腺阳。 我是一名探鬼主播落君,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亭引!你這毒婦竟也來了绎速?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤焙蚓,失蹤者是張志新(化名)和其女友劉穎纹冤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體购公,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萌京,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了君丁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枫夺。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绘闷,靈堂內(nèi)的尸體忽然破棺而出橡庞,到底是詐尸還是另有隱情,我是刑警寧澤印蔗,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布扒最,位于F島的核電站,受9級特大地震影響华嘹,放射性物質(zhì)發(fā)生泄漏吧趣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一耙厚、第九天 我趴在偏房一處隱蔽的房頂上張望强挫。 院中可真熱鬧,春花似錦薛躬、人聲如沸俯渤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽八匠。三九已至,卻和暖如春趴酣,著一層夾襖步出監(jiān)牢的瞬間梨树,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工岖寞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抡四,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓仗谆,卻偏偏與公主長得像床嫌,于是被迫代替她去往敵國和親跨释。 傳聞我的和親對象是個殘疾皇子胸私,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容