[iOS] objc_setAssociatedObject objc_getAssociatedObject 簡單明瞭的一個理解 數組
關聯app
關聯是指把兩個對象相互關聯起來,使得其中的一個對象做爲另一個對象的一部分。
關聯特性只有在Mac OS X V10.6以及之後的版本上纔是可用的。函數
在類的定義以外爲類增長額外的存儲空間
使用關聯,咱們能夠不用修改類的定義而爲其對象增長存儲空間。這在咱們沒法訪問到類的源碼的時候或者是考慮到二進制兼容性的時候是很是有用。
關聯是基於關鍵字的,所以,咱們能夠爲任何對象增長任意多的關聯,每一個都使用不一樣的關鍵字便可。關聯是能夠保證被關聯的對象在關聯對象的整個生命週期都是可用的(在垃圾自動回收環境下也不會致使資源不可回收)。spa
建立關聯
建立關聯要使用到Objective-C的運行時函數:objc_setAssociatedObject來把一個對象與另一個對象進行關聯。該函數須要四個參數:源對象,關鍵字,關聯的對象和一個關聯策略。固然,此處的關鍵字和關聯策略是須要進一步討論的。
■ 關鍵字是一個void類型的指針。每個關聯的關鍵字必須是惟一的。一般都是會採用靜態變量來做爲關鍵字。
■ 關聯策略代表了相關的對象是經過賦值,保留引用仍是複製的方式進行關聯的;還有這種關聯是原子的仍是非原子的。這裏的關聯策略和聲明屬性時的很相似。這種關聯策略是經過使用預先定義好的常量來表示的。
下面的代碼展現瞭如何把一個字符串關聯到一個數組上。.net
列表7-1 把一個字符串關聯到一個數組指針
[cpp] view plaincopyorm
- static char overviewKey;
- 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策略指明瞭數組要保有相關的對象。當數組array被銷燬的時候,也就是在(2)處overview也就會被釋放,所以而被銷燬。若是此時還想使用overview,例如想經過log來輸出overview的值,則會出現運行時異常。對象
獲取相關聯的對象
獲取相關聯的對象時使用Objective-C函數objc_getAssociatedObject。接着上面列表7-1的代碼,咱們可使用以下代碼來獲取與array相關聯的字符串:
[cpp] view plaincopyblog