首先要講到一點
就是extension和category是不同的概念畅姊。
特別是針對屬性這一點的區(qū)別上面,前者是在編譯期決定的對象的內存分配吹由,后者并不能在編譯期去決定一個對象的內存分配若未。
前者會生成一個私有成員變量,并且通過setter和getter去訪問和操作這個成員變量倾鲫。
但是在category中粗合,并不能去生成這個私有變量,因為對象的結構在編譯期已經被決定了级乍。
所以想在category中實現(xiàn)屬性的概念舌劳,那么就要用到關聯(lián)類型了。
會用到這兩個函數(shù)玫荣,一個用來設置甚淡,一個用來獲取
objc_setAssociatedObject(self, @"name",name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_getAssociatedObject(self, @"name");
把對應代碼放到屬性的getter和setter里就可以實現(xiàn)需要的動態(tài)增加屬性功能。
-- 實現(xiàn)原理
全局保存一個AssociationManager
AssociationManger存有一個AssociationHashMap(哈希表,值類型為ObjectAssociationMap)
根據傳入的object做DISGUISE(系列的變形操作),并以此作為AssociationHashMap的鍵贯卦。
ObjcAssociation是一個類型(包含了policy和value)
如果是設值资柔,就可以 創(chuàng)建一個ObjcAssociation(由傳入的value和policy),并且根據傳入的key,以鍵值的形式存儲到object對應的ObjectAssociationMap里撵割。
如果是取值贿堰,就是通過object取到對應的ObjectAssociationMap,并且通過key,取到對應的ObjcAssociation, 再通過對應的value。