? ? ? 前兩天一直在看JSPatch的實現(xiàn)原理,然后就發(fā)現(xiàn)一個objc_setAssociatedObject這個東西,這個東西呢主要是實現(xiàn)關(guān)聯(lián).該函數(shù)和objc_getAssociatedObject是配套是使用的,當然,既然可以關(guān)聯(lián),那么我們還可以移除關(guān)聯(lián)objc_removeAssociatedObjects就是這個函數(shù).
?1.創(chuàng)建關(guān)聯(lián)
? ? ? 創(chuàng)建關(guān)聯(lián)要使用到Objective-C的運行時函數(shù):objc_setAssociatedObject來把一個對象與另外一個對象進行關(guān)聯(lián)剔蹋。該函數(shù)需要四個參數(shù):源對象,關(guān)鍵字唆阿,關(guān)聯(lián)的對象和一個關(guān)聯(lián)策略姊舵。當然竞端,此處的關(guān)鍵字和關(guān)聯(lián)策略是需要進一步討論的。
? ? ?參數(shù):1>源對象一般填寫self(這里以寫self我相信大家應該就懂源對象代表什么意思了)
? ? ? ? ? ? 2>關(guān)鍵字:關(guān)鍵字是一個void類型的指針。每一個關(guān)聯(lián)的關(guān)鍵字必須是唯一的玄妈。通常都是會采用靜態(tài)變量來作為關(guān)鍵字侦镇。
? ? ? ? ? ? ?3>關(guān)聯(lián)的對象:填寫我們想要關(guān)聯(lián)的對象即可.
? ? ? ? ? ? ?4>關(guān)聯(lián)策略: 關(guān)聯(lián)策略是一個枚舉:
? ? ? ? ? ? ? OBJC_ASSOCIATION_ASSIGN =0, 指定一個弱引用的關(guān)聯(lián)對象
? ? ? ? ? ? ? OBJC_ASSOCIATION_RETAIN_NONATOMIC =1,指定一個強引用相關(guān)聯(lián)的對象 不自動
? ? ? ? ? ? ? OBJC_ASSOCIATION_COPY_NONATOMIC =3,指定相關(guān)的對象被復制灵疮。不自動
? ? ? ? ? ? ? OBJC_ASSOCIATION_RETAIN =01401,指定相關(guān)對象的強引用。自動
? ? ? ? ? ? ? OBJC_ASSOCIATION_COPY =01403.指定相關(guān)的對象被復制壳繁。自動
至于,獲得關(guān)聯(lián)和移除關(guān)聯(lián),參數(shù)設(shè)置同上!
下面附上自己寫的一個小demo,具體請參見筆者的github地址GitHub - 995996812/UIButtonBlock: UIButtonBlock!