分類里添加屬性冈钦,僅僅是生成了set和get方法的聲明,并沒有實現(xiàn)劫樟,需要我們自己寫set和get的方法。
幾種set,get方法實現(xiàn)案例
1.可以全局字典實現(xiàn)屬性的存取
//聲明全局的字典
NSMutableDictionary *_names_;
//load方法實現(xiàn)字典
+ (void)load
{
?? _ names_ = [NSMutableDictionary dictionary];
}
//實現(xiàn)set方法
-(void)setName:(NSstring *)name
{
?? NSString *key = [NSString stringWithFormat:@"%p", self];
? ? names_[MJKey] = name;
}
//實現(xiàn)get方法
- (NSString *)name
{
//? ? NSString *key = [NSString stringWithFormat:@"%p", self];
? ? return names_[MJKey];
}
存在的問題:
全局變量無法釋放?
如果每個類在不不同的線程蛋勺,同時訪問set和get,如果不不加鎖鸠删,可能會出現(xiàn)問題
2.關(guān)聯(lián)對象
- (void)setName:(NSString *)name
{
? ? objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name
{
? ? // 隱式參數(shù)
? ? // _cmd == @selector(name)
? ? return objc_getAssociatedObject(self, _cmd);
}
第四個參數(shù)為關(guān)聯(lián)策略抱完,和變量的對應(yīng)關(guān)系
第二個參數(shù)key
第一種方法利用字符串作為key,其中利用@"string",這樣寫的字符串是放在常量區(qū)的冶共,無論哪里用到都是同一內(nèi)存同一地址乾蛤,但是這樣寫容易寫錯每界,且編譯器沒有提醒
更推薦第二種寫法,不容易記錯其中@selector(name),_cmd_,是函數(shù)的隱式參數(shù)
實現(xiàn)關(guān)聯(lián)對象技術(shù)的核心對象
AssociationsManager
AssociationsHashMap
ObjectAssociationMap
ObjectAssociation
其中AssociationsManager類管理了一個全局的散列表家卖,key是添加管理屬性的對象眨层,value是ObjectAssociationMap的散列表,其中key是第二個參數(shù)上荡,value是ObjectAssociation類趴樱,ObjectAssociation其中包含有value和policy,也就是我們傳入的第三和第四個參數(shù)
關(guān)聯(lián)對象并不是存儲在被關(guān)聯(lián)對象本身的內(nèi)存中
關(guān)聯(lián)對象存儲在全局的同一的AssociationsManager中
設(shè)置關(guān)聯(lián)對象為nil,相當于移出關(guān)聯(lián)對象