無 [Objective-C]關聯(lián)(objc_setAssociatedObject、objc_getAssociatedObject京景、objc_removeAssociatedObjects)標題文章

關聯(lián)

關聯(lián)是指把兩個對象相互關聯(lián)起來窿冯,使得其中的一個對象作為另外一個對象的一部分。

關聯(lián)特性只有在Mac OS X V10.6以及以后的版本上才是可用的确徙。

在類的定義之外為類增加額外的存儲空間

使用關聯(lián)醒串,我們可以不用修改類的定義而為其對象增加存儲空間。這在我們無法訪問到類的源碼的時候或者是考慮到二進制兼容性的時候是非常有用鄙皇。

關聯(lián)是基于關鍵字的芜赌,因此,我們可以為任何對象增加任意多的關聯(lián)伴逸,每個都使用不同的關鍵字即可缠沈。關聯(lián)是可以保證被關聯(lián)的對象在關聯(lián)對象的整個生命周期都是可用的(在垃圾自動回收環(huán)境下也不會導致資源不可回收)。

創(chuàng)建關聯(lián)

創(chuàng)建關聯(lián)要使用到Objective-C的運行時函數(shù):objc_setAssociatedObject來把一個對象與另外一個對象進行關聯(lián)错蝴。該函數(shù)需要四個參數(shù):源對象洲愤,關鍵字,關聯(lián)的對象和一個關聯(lián)策略顷锰。當然柬赐,此處的關鍵字和關聯(lián)策略是需要進一步討論的。

■ ?關鍵字是一個void類型的指針官紫。每一個關聯(lián)的關鍵字必須是唯一的肛宋。通常都是會采用靜態(tài)變量來作為關鍵字。

■ ?關聯(lián)策略表明了相關的對象是通過賦值束世,保留引用還是復制的方式進行關聯(lián)的酝陈;還有這種關聯(lián)是原子的還是非原子的。這里的關聯(lián)策略和聲明屬性時的很類似毁涉。這種關聯(lián)策略是通過使用預先定義好的常量來表示的沉帮。

下面的代碼展示了如何把一個字符串關聯(lián)到一個數(shù)組上。

列表7-1 把一個字符串關聯(lián)到一個數(shù)組

[cpp]view plaincopy

staticcharoverviewKey;

NSArray?*?array?=[[NSArray?alloc]?initWidthObjects:@"One",?@"Two",?@"Three",?nil];

//為了演示的目的,這里使用initWithFormat:來確保字符串可以被銷毀

NSString?*?overview?=?[[NSString?alloc]?initWithFormat:@"@",@"First?three?numbers"];

objc_setAssociatedObject(array,?&overviewKey,?overview,?OBJC_ASSOCIATION_RETAIN);

[overview?release];

//(1)?overview仍然是可用的

[array?release];

//(2)overview?不可用

在(1)處遇西,字符串overview仍然是可用的馅精,這是因為OBJC_ASSOCIATION_RETAIN策略指明了數(shù)組要保有相關的對象。當數(shù)組array被銷毀的時候粱檀,也就是在(2)處overview也就會被釋放洲敢,因此而被銷毀。如果此時還想使用overview茄蚯,例如想通過log來輸出overview的值压彭,則會出現(xiàn)運行時異常。

獲取相關聯(lián)的對象

獲取相關聯(lián)的對象時使用Objective-C函數(shù)objc_getAssociatedObject渗常。接著上面列表7-1的代碼壮不,我們可以使用如下代碼來獲取與array相關聯(lián)的字符串:

[cpp]view plaincopy

NSString?*?associatedObject?=?(NSString?*)objc_getAssociatedObject(array,?&oveviewKey);

斷開關聯(lián)

斷開關聯(lián)是使用objc_setAssociatedObject函數(shù),傳入nil值即可皱碘。

接著列表7-1中的程序询一,我們可以使用如下的代碼來斷開字符串overview和arry之間的關聯(lián):

[cpp]view plaincopy

objc_setAssociatedObject(array,?&overviewKey,?nil,?OBJC_ASSOCIATION_ASSIGN);

其中坑雅,被關聯(lián)的對象為nil朽褪,此時關聯(lián)策略也就無關緊要了。

使用函數(shù)objc_removeAssociatedObjects可以斷開所有關聯(lián)罩缴。通常情況下不建議使用這個函數(shù)踢俄,因為他會斷開所有關聯(lián)缩功。只有在需要把對象恢復到“原始狀態(tài)”的時候才會使用這個函數(shù)。

一個完整的實例程序

下面的程序綜合了前面的代碼.

[cpp]view plaincopy

#import?

#import?

intmain(intargc,constchar*?argv[])

{

NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool]?alloc?init];

staticcharoverviewKey;

NSArray?*array?=[[NSArray?alloc]?initWidthObjects:@"One",?@"Two",?@"Three",?nil];

//為了演示的目的都办,這里使用initWithFormat:來確保字符串可以被銷毀

NSString?*?overview?=?[[NSString?alloc]?initWithFormat:@"@",@"First?three?numbers"];

objc_setAssociatedObject(array,?&overviewKey,?overview,?OBJC_ASSOCIATION_RETAIN);

[overview?release];

NSString?*associatedObject?=?(NSString?*)objc_getAssociatedObject(arrray,?&overviewKey);

NSLog(@"associatedObject:%@",?associatedObject);

objc_setAssociatedObject(array,?&overviewKey,?nil,?OBJC_ASSOCIATION_ASSIGN);

[array?release];

[pool?drain];

return0;

}

轉載于:http://blog.csdn.net/onlyou930/article/details/9299169

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫡锌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琳钉,更是在濱河造成了極大的恐慌势木,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歌懒,死亡現(xiàn)場離奇詭異跟压,居然都是意外死亡,警方通過查閱死者的電腦和手機歼培,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茸塞,“玉大人躲庄,你說我怎么就攤上這事〖嘏埃” “怎么了噪窘?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長效扫。 經(jīng)常有香客問我倔监,道長直砂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任浩习,我火速辦了婚禮静暂,結果婚禮上,老公的妹妹穿的比我還像新娘谱秽。我一直安慰自己洽蛀,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布疟赊。 她就那樣靜靜地躺著郊供,像睡著了一般。 火紅的嫁衣襯著肌膚如雪近哟。 梳的紋絲不亂的頭發(fā)上驮审,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音吉执,去河邊找鬼疯淫。 笑死,一個胖子當著我的面吹牛鼠证,可吹牛的內(nèi)容都是我干的峡竣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼量九,長吁一口氣:“原來是場噩夢啊……” “哼适掰!你這毒婦竟也來了?” 一聲冷哼從身側響起荠列,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤类浪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肌似,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體费就,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年川队,在試婚紗的時候發(fā)現(xiàn)自己被綠了力细。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡固额,死狀恐怖眠蚂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斗躏,我是刑警寧澤逝慧,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響笛臣,放射性物質(zhì)發(fā)生泄漏云稚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一沈堡、第九天 我趴在偏房一處隱蔽的房頂上張望静陈。 院中可真熱鬧,春花似錦踱蛀、人聲如沸窿给。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崩泡。三九已至,卻和暖如春猬膨,著一層夾襖步出監(jiān)牢的瞬間角撞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工勃痴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谒所,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓沛申,卻偏偏與公主長得像劣领,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铁材,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容