iOS底層解析-----Cateogry解析 關(guān)聯(lián)對象原理

先拋出 分類Category 的底層結(jié)構(gòu)


分類數(shù)據(jù)結(jié)構(gòu).png

Category的用法經(jīng)常用到荒叼,第一印象就是給一個類擴展方法
本文主要分析一下三個問題
1.分類的方法的運行原理以及它方法的運行順序
2.從分類角度深入分析load initialize 方法的調(diào)用原理及調(diào)用順序
3.關(guān)聯(lián)屬性的實現(xiàn)原理

1.分類的方法的運行原理以及它方法的運行順序
isa指針看繼承關(guān)系中我們知道一個實例對象的方法存放在它的class對象中叔营,那么我們給一個類添加的Cateogry方法是否也存放在它的類的class對象中
先看代碼

@interface Person : NSObject
- (void)run;
@end

@implementation Person
- (void)run
{
    NSLog(@"Person - run");
}
@end


@interface Person (Test) 
- (void)test;
@end

@implementation Person (Test)
- (void)test
{
    NSLog(@"test");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        [person run];
        [person test];
    }
    return 0;
}

[person run] 與 [person test] 都運行了柒竞,看編譯后的代碼如下:
編譯后數(shù)據(jù)結(jié)構(gòu).png

它的數(shù)據(jù)結(jié)構(gòu)就是如開始的數(shù)據(jù)結(jié)構(gòu)表,這個數(shù)據(jù)表在運行時的時候會動態(tài)的添加到Person實例類的Class類中,動態(tài)添加過程如下:
category的加載處理過程.png

那么有上面的解釋可看出逢慌,一個類的分類方法會優(yōu)先類的方法調(diào)用工闺,因為它在class類的方法數(shù)據(jù)結(jié)構(gòu)的前面,所以會優(yōu)先調(diào)用匆篓,那么可以解釋如下代碼

@interface Person : NSObject
- (void)run;
@end

@implementation Person
- (void)run
{
    NSLog(@"Person - run");
}
@end


@interface Person (Test) 
- (void)test;
@end

@implementation Person (Test)
- (void)run
{
    NSLog(@"Person(test) - run");
}
- (void)test
{
    NSLog(@"test");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
  
        [person run];//會調(diào)用分類中的run方法
    }
    return 0;
}

2.從分類角度深入分析load initialize 方法的調(diào)用原理及調(diào)用順序
只給出結(jié)論,不再展開分析

+load方法
+load方法.png

+initialize方法
+initialize方法.png

3.關(guān)聯(lián)屬性的實現(xiàn)原理

默認情況下寇窑,因為分類底層結(jié)構(gòu)的限制鸦概,不能添加成員變量到分類中,但是可以通過關(guān)聯(lián)對象來間接實現(xiàn)

關(guān)聯(lián)對象提供了以下API
//添加關(guān)聯(lián)對象
void objc_setAssociatedObject(id object, const void *key, id value,objc_AssociationPolicy policy)

//獲取關(guān)聯(lián)對象
id objc_getAssociatedObject(id object, const void *key)

//移除所有的關(guān)聯(lián)對象
void objc_removeAssociatedObjects(id object)


key的最優(yōu)用法
objc_setAssociatedObject(obj, @selector(getter),  value, OHJC_ASS0CIATION_RETAIN_NONATOMIC)

objc_getAssociatedObject(obj, @selector(getter))

修飾符.png

實現(xiàn)原理(hashMap)


核心對象.png

實現(xiàn)過程
過程.png

下篇筆記鏈接
iOS 底層解析-----Block (上)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甩骏,一起剝皮案震驚了整個濱河市窗市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饮笛,老刑警劉巖咨察,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異福青,居然都是意外死亡摄狱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門无午,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒役,“玉大人,你說我怎么就攤上這事宪迟】蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵踩验,是天一觀的道長鸥诽。 經(jīng)常有香客問我,道長箕憾,這世上最難降的妖魔是什么牡借? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮袭异,結(jié)果婚禮上钠龙,老公的妹妹穿的比我還像新娘。我一直安慰自己御铃,他們只是感情好碴里,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著上真,像睡著了一般咬腋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睡互,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天根竿,我揣著相機與錄音陵像,去河邊找鬼。 笑死寇壳,一個胖子當著我的面吹牛醒颖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壳炎,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼泞歉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匿辩?” 一聲冷哼從身側(cè)響起腰耙,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撒汉,沒想到半個月后沟优,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡睬辐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年挠阁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯饵。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡侵俗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丰刊,到底是詐尸還是另有隱情隘谣,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布啄巧,位于F島的核電站寻歧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秩仆。R本人自食惡果不足惜码泛,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澄耍。 院中可真熱鬧噪珊,春花似錦、人聲如沸齐莲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽选酗。三九已至阵难,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間星掰,已是汗流浹背多望。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工嫩舟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氢烘,地道東北人怀偷。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像播玖,于是被迫代替她去往敵國和親椎工。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349