category?分類
專門(mén)用來(lái)各類添加新的方法盖淡。
不能給類添加成員屬性年柠,添加了成員變量,也無(wú)法取到(注意:其實(shí)可以通過(guò)runtime給分類添加屬性)褪迟。
注意:可以用runtime給分類添加屬性
分類中用@property定義變量冗恨,只會(huì)生成變量的getter setter方法的聲明,不能生成方法實(shí)現(xiàn)和帶下劃線的成員變量味赃。
extension 類拓展
可以說(shuō)成是特殊的分類掀抹,也稱作匿名分類。
可以給類添加成員屬性心俗,但是是私有變量傲武。
可以給類添加方法,也是私有方法另凌。
關(guān)聯(lián)對(duì)象
設(shè)值:
深入分析一下這個(gè)方法
1.DisguisedPtr:封裝object對(duì)象谱轨,用來(lái)查詢map的key值
2.ObjcAssociation:封裝策略和值
3.AssociationsManager:里面包含一個(gè)靜態(tài)map,用來(lái)處理關(guān)聯(lián)對(duì)象的表
4.AssociationsHashMap:一個(gè)map吠谢,初始化傳入的是AssociationsManager對(duì)象中的靜態(tài)表土童,
我們可以發(fā)現(xiàn)AssociationsManager可以有多個(gè)。下面就到了AssociationsHashMap工坊,這個(gè)是HashMap這是個(gè)哈希表献汗,這個(gè)是唯一的敢订。因?yàn)锳ssociationsManager方法里看到AssociationsHashMap是通過(guò)_mapStorage.get()方法獲得,而_mapStorage是通過(guò)static聲明的罢吃,是靜態(tài)變量楚午,也就是AssociationsHashMap是通過(guò)靜態(tài)變量_mapStorage獲取的,所以是全場(chǎng)唯一的尿招。
5.association.acquireValue();使用傳入的策略對(duì)value值進(jìn)行引用計(jì)算的處理
如果是retain類型就調(diào)用objc_retain矾柜,如果是copy類型就發(fā)送copy消息。也就是對(duì)我們的策略類型進(jìn)行處理
auto refs_result = associations.try_emplace(disguised, ObjectAssociationMap{});從靜態(tài)map中通過(guò)object取出一個(gè)包含兩個(gè)數(shù)據(jù)的結(jié)構(gòu)
if (refs_result.second) 如果是對(duì)象的第一次關(guān)聯(lián)就谜,則對(duì)對(duì)象的isa關(guān)聯(lián)變量設(shè)值為true
8.refs.try_emplace(key, std::move(association)); 通過(guò)object 找到靜態(tài)表(MAP)中對(duì)應(yīng)的表(MAP)怪蔑,在通過(guò)傳入的key進(jìn)行設(shè)值value。
關(guān)聯(lián)對(duì)象設(shè)值流程:
1: 創(chuàng)建?個(gè) AssociationsManager 管理類
2: 獲取唯?的全局靜態(tài)哈希Map
3: 判斷是否插?的關(guān)聯(lián)值是否存在
? ? 3.1: 存在?第4步
? ? 3.2: 不存在就? : 關(guān)聯(lián)對(duì)象插?空流程
4: 創(chuàng)建?個(gè)空的 ObjectAssociationMap 去取查詢的鍵值對(duì)
5: 如果發(fā)現(xiàn)沒(méi)有這個(gè) key 就插??個(gè) 空的 BucketT進(jìn)去 返回
6: 標(biāo)記對(duì)象存在關(guān)聯(lián)對(duì)象
7: ?當(dāng)前 修飾策略 和 值 組成了?個(gè) ObjcAssociation 替換原來(lái) BucketT 中的空
8: 標(biāo)記?下 ObjectAssociationMap 的第?次為 false
關(guān)聯(lián)對(duì)象插?空流程:
1: 根據(jù) DisguisedPtr 找到 AssociationsHashMap 中的 iterator 迭代查詢器
2: 清理迭代器
3: 其實(shí)如果插?空置 相當(dāng)于清除
取值:
關(guān)聯(lián)對(duì)象取值流程:
1: 創(chuàng)建?個(gè) AssociationsManager 管理類
2: 獲取唯?的全局靜態(tài)哈希Map
3: 根據(jù) DisguisedPtr 找到 AssociationsHashMap 中的 iterator 迭代查詢器
4: 如果這個(gè)迭代查詢器不是最后?個(gè) 獲取 : ObjectAssociationMap (這?有策略和value)
5: 找到ObjectAssociationMap的迭代查詢器獲取?個(gè)經(jīng)過(guò)屬性修飾符修飾的value
6: 返回_value
關(guān)聯(lián)對(duì)象本質(zhì)
?關(guān)聯(lián)對(duì)象底層實(shí)現(xiàn):其實(shí)就是兩層哈希map , 存取的時(shí)候兩層處理丧荐。