資源描述:
《iOS中開(kāi)發(fā)中Associative機(jī)制使用場(chǎng)景》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、iOS開(kāi)發(fā)中Associative機(jī)制使用場(chǎng)景Associative機(jī)制使用場(chǎng)景這篇文章是來(lái)口藍(lán)鷗鄭州已經(jīng)畢業(yè)的學(xué)員■鄭同學(xué)投的稿件,雖然小編不懂技術(shù),但看過(guò)的人都說(shuō):這篇文章寫的不錯(cuò)。條理清晰,邏輯層層遞進(jìn),適合iOS中級(jí)開(kāi)發(fā)者學(xué)習(xí)!1?概念objective-c有兩個(gè)擴(kuò)展機(jī)制:category和associative。我們可以通過(guò)category來(lái)擴(kuò)展方法,但是它有個(gè)很大的局限性,不能擴(kuò)展屬性。于是,就有了專門用來(lái)擴(kuò)展屬性的機(jī)制:associative。2?使用方法在iOS開(kāi)發(fā)過(guò)程中,category比較常見(jiàn),而associative就用的比較少。ass
2、ociative的主要原理,就是把兩個(gè)對(duì)彖相互關(guān)聯(lián)起來(lái),使得其屮的一個(gè)對(duì)彖作為另外一個(gè)對(duì)彖的一部分。使用associative,我們可以彳、用修改類的定義血為其對(duì)象增加存儲(chǔ)空間。這在我們無(wú)法訪問(wèn)到類的源碼的時(shí)候或者是考慮到二進(jìn)制兼容性的時(shí)候是非常有用。associative是基于關(guān)鍵字的。因此,我們可以為任何對(duì)象增加任意多的associative,每個(gè)都使用不同的關(guān)鍵字即可。associative是可以保證被關(guān)聯(lián)的對(duì)象在關(guān)聯(lián)對(duì)象的整個(gè)生命周期都是可用的。associative機(jī)制提供了三個(gè)方法:?objc_setAssociatedObject(idobje
3、ct,constvoid*keyzidvalue,objc_AssociationPolicypolicy)?objc_getAssociatedObject(idobjectzconstvoiMkey)?objc_removeAssociatedObjects(idobject)2.1創(chuàng)建associative創(chuàng)建associative使用的是:objjsetAssocimtedObject。它把一個(gè)對(duì)彖與另外一個(gè)對(duì)象進(jìn)行關(guān)聯(lián)。該函數(shù)需要四個(gè)參數(shù):源對(duì)象,關(guān)鍵字,關(guān)聯(lián)的對(duì)象、關(guān)聯(lián)策略。關(guān)鍵字是一個(gè)void類型的指針。每一個(gè)關(guān)聯(lián)的關(guān)鍵字必須是唯一的。通常都是
4、會(huì)采用靜態(tài)變量來(lái)作為關(guān)鍵字。關(guān)聯(lián)策略表明了相關(guān)的對(duì)象是通過(guò)賦值,保留引用還是復(fù)制的方式進(jìn)行關(guān)聯(lián)的;還有這種關(guān)聯(lián)是原子的還是非原子的。這里的關(guān)聯(lián)策略和聲明屬性時(shí)的很類似。這種關(guān)聯(lián)策略是通過(guò)使用預(yù)先定義好的常量來(lái)表示的。比如,我們想對(duì)一個(gè)UlView,添加一個(gè)NSString類型的tag??梢赃@么做:-(void)setTagString:(NSString*)value{objc_setAssociatedObject(self,KEY_TAGSTRING,value,OBJC_ASsoC1AT1ON_RETA1N_NONATOM1C);}2.2?獲取asso
5、ciative對(duì)象獲取相關(guān)聯(lián)的是函數(shù)objc_getAssociatedObjecto繼續(xù)上面的例子,從_個(gè)UlView的實(shí)例中,獲取一個(gè)NSString類型的tag-(NSString*)tagstring{NSObject*obj=objc_getAssociatedObject(Self,KEY_TAGSTRING);if(obj&&[objisKindOfclass:[NSStringclass]]){return(NSString*)obj;}returnnil;}2?3?斷開(kāi)associative斷開(kāi)associative是使用objc_setA
6、ssociatedObject函數(shù),傳入nil值即可。objc_setAssociatedObject(Self,KEY_TAGSTRINGZni1zobjc_assoCIATION_RETAIN_NONATOMIC);使用函數(shù)objc_removeAssociatedObjects也口」以斷開(kāi)所冇associative。通常情況下不建議這么做,因?yàn)樗麜?huì)斷開(kāi)所有關(guān)聯(lián)。3.應(yīng)用場(chǎng)景3.1.TagString上面的例子提到,在UlView'P添加NSString類型的標(biāo)記,就是一個(gè)非常實(shí)用的例子。全部的代碼如下:?interfaceUIVicw(BDTag)@p
7、roperty(nonatomic,retain)NSString*tegstring;-(UlVicw*)viewWithTagString:(NSString*)value;@end#importUIView+BDTag.h〃#undefKEY_TAGSTRING#defineKEY_TAGSTRING"UlView.tagString"?implementationUTView(BDTag)@dynamictagstring;-(NSString*)tagString{NSObject*obj=objc_getAssociatedObject(self
8、,KEY_TAGSTRING);if(obj&&[o