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