OC關(guān)聯(lián)對(duì)象小結(jié)(一)

OC關(guān)聯(lián)對(duì)象小結(jié)(一)

使用場(chǎng)景

為現(xiàn)有的類添加屬性蒲肋,變量

在Objective-C中可以通過Category給一個(gè)現(xiàn)有的類添加屬性(如NSObject),但是卻不能添加實(shí)例變量忱嘹,然而可以通過Associated Object間接地達(dá)到這一目的。示例代碼展示了給NSObject添加實(shí)例變量。

KVO創(chuàng)建一個(gè)關(guān)聯(lián)的觀察者

相關(guān)函數(shù)

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
id objc_getAssociatedObject(id object, const void *key);
void objc_removeAssociatedObjects(id object);

objc_setAssociatedObject用于給對(duì)象添加關(guān)聯(lián)對(duì)象仍律,傳nil可以移除相關(guān)的關(guān)聯(lián)對(duì)象。
objc_getAssocicatedObject用于獲取關(guān)聯(lián)對(duì)象的值实柠。
objc_removeAssociatedObject用于移除該對(duì)象的所有關(guān)聯(lián)對(duì)象水泉。如果打算只移除一部分則不能使用該方法。

相關(guān)參數(shù)

key:要保證全局唯一窒盐,key與關(guān)聯(lián)的對(duì)象是一一對(duì)應(yīng)關(guān)系草则。必須全局唯一。通常用@selector(methodName)作為key蟹漓。
value:要關(guān)聯(lián)的對(duì)象炕横。
policy:關(guān)聯(lián)策略。有五種關(guān)聯(lián)策略葡粒。
OBJC_ASSOCIATION_ASSIGN 等價(jià)于 @property(assign)份殿。
OBJC_ASSOCIATION_RETAIN_NONATOMIC等價(jià)于 @property(strong, nonatomic)
OBJC_ASSOCIATION_COPY_NONATOMIC等價(jià)于@property(copy, nonatomic)嗽交。
OBJC_ASSOCIATION_RETAIN等價(jià)于@property(strong,atomic)卿嘲。
OBJC_ASSOCIATION_COPY等價(jià)于@property(copy, atomic)

原理簡介

運(yùn)行時(shí)通過map維系一張關(guān)聯(lián)對(duì)象與被關(guān)聯(lián)對(duì)象之間的關(guān)系夫壁。
objc_setAssociatedObject的相關(guān)代碼.

void _object_set_associative_reference(id object, void *key, id value, uintptr_t policy) {
// retain the new value (if any) outside the lock.
ObjcAssociation old_association(0, nil);
id new_value = value ? acquireValue(value, policy) : nil;
{
AssociationsManager manager;
AssociationsHashMap &associations(manager.associations());
disguised_ptr_t disguised_object = DISGUISE(object);
if (new_value) {
// break any existing association.
AssociationsHashMap::iterator i = associations.find(disguised_object);
if (i != associations.end()) {
// secondary table exists
ObjectAssociationMap *refs = i->second;
ObjectAssociationMap::iterator j = refs->find(key);
if (j != refs->end()) {
old_association = j->second;
j->second = ObjcAssociation(policy, new_value);
} else {
(*refs)[key] = ObjcAssociation(policy, new_value);
}
} else {
// create the new association (first time).
ObjectAssociationMap *refs = new ObjectAssociationMap;
associations[disguised_object] = refs;
(*refs)[key] = ObjcAssociation(policy, new_value);
object->setHasAssociatedObjects();
}
} else {
// setting the association to nil breaks the association.
AssociationsHashMap::iterator i = associations.find(disguised_object);
if (i !=  associations.end()) {
ObjectAssociationMap *refs = i->second;
ObjectAssociationMap::iterator j = refs->find(key);
if (j != refs->end()) {
old_association = j->second;
refs->erase(j);
}
}
}
}
// release the old value (outside of the lock).
if (old_association.hasValue()) ReleaseValue()(old_association);
}

代碼中涉及到的一些數(shù)據(jù)結(jié)構(gòu)拾枣。

  1. AssociationsManager 是頂級(jí)的對(duì)象,維護(hù)了一個(gè)從 spinlock_t 鎖到 AssociationsHashMap 哈希表的單例鍵值對(duì)映射掌唾;
  2. AssociationsHashMap 是一個(gè)無序的哈希表放前,維護(hù)了從對(duì)象地址到 ObjectAssociationMap 的映射;
  3. ObjectAssociationMap 是一個(gè) C 中的 map 糯彬,維護(hù)了從 key 到 ObjcAssociation 的映射凭语,即關(guān)聯(lián)記錄;
  4. ObjcAssociation 是一個(gè) C 的類撩扒,表示一個(gè)具體的關(guān)聯(lián)結(jié)構(gòu)似扔,主要包括兩個(gè)實(shí)例變量吨些,_policy 表示關(guān)聯(lián)策略,_value 表示關(guān)聯(lián)對(duì)象炒辉。
    流程圖如下:



    看懂這個(gè)豪墅,那其他的幾個(gè)也就懂了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末黔寇,一起剝皮案震驚了整個(gè)濱河市偶器,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缝裤,老刑警劉巖屏轰,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異憋飞,居然都是意外死亡霎苗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門榛做,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唁盏,“玉大人,你說我怎么就攤上這事检眯±謇蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵轰传,是天一觀的道長驴党。 經(jīng)常有香客問我,道長获茬,這世上最難降的妖魔是什么港庄? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮恕曲,結(jié)果婚禮上鹏氧,老公的妹妹穿的比我還像新娘。我一直安慰自己佩谣,他們只是感情好把还,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茸俭,像睡著了一般痘系。 火紅的嫁衣襯著肌膚如雪柒巫。 梳的紋絲不亂的頭發(fā)上想虎,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天补憾,我揣著相機(jī)與錄音,去河邊找鬼腾窝。 笑死缀踪,一個(gè)胖子當(dāng)著我的面吹牛居砖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驴娃,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼奏候,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了唇敞?” 一聲冷哼從身側(cè)響起蔗草,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疆柔,沒想到半個(gè)月后蕉世,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婆硬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奸例。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彬犯。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖查吊,靈堂內(nèi)的尸體忽然破棺而出谐区,到底是詐尸還是另有隱情,我是刑警寧澤逻卖,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布宋列,位于F島的核電站,受9級(jí)特大地震影響评也,放射性物質(zhì)發(fā)生泄漏炼杖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一盗迟、第九天 我趴在偏房一處隱蔽的房頂上張望坤邪。 院中可真熱鬧,春花似錦罚缕、人聲如沸艇纺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黔衡。三九已至,卻和暖如春腌乡,著一層夾襖步出監(jiān)牢的瞬間盟劫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工导饲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捞高,地道東北人氯材。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像硝岗,于是被迫代替她去往敵國和親氢哮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉型檀,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,725評(píng)論 0 9
  • 1.runtime體驗(yàn) 1.1.引言 運(yùn)行時(shí)作為面試題中高階問題必不可少的一個(gè)技能點(diǎn)冗尤。經(jīng)常面試官會(huì)問道是否使...
    2897275c8a00閱讀 940評(píng)論 0 5
  • 古今成大事業(yè),大學(xué)問者胀溺,必經(jīng)過三種境界: 第一重“尋”境界——“昨夜西風(fēng)凋碧樹裂七。獨(dú)上高樓,望盡天涯路仓坞”沉悖”出自晏殊的...
    白樺林H_L_Peng閱讀 978評(píng)論 0 2
  • 在我暴飲暴食的時(shí)候,在那個(gè)阿姨的水果攤攤无埃,她是她的女兒徙瓶,她是她的慈母,見到女孩笑得一瞬間嫉称,冰凍的心開始消融侦镇,我仿佛...
    撿起遺失的夢(mèng)閱讀 227評(píng)論 0 0
  • 一. 逃避性防御機(jī)制: 1、壓抑(壓制suppression/潛抑repression)织阅,壓抑是各種防御機(jī)制中最基...
    九思貓閱讀 2,721評(píng)論 0 1