在項目開發中,常常會使用到關聯,就是將兩個實例對象綁定,使得其中一個實例對象成爲另外一個實例對象的一部分。關聯特性在mac os 10.6 及ios 3.1以上纔可使用。ios
關聯的使用是基於關鍵字來實現,也就是說一個對象可使用不一樣的關鍵字來實現隨意多的關聯。另外關聯能夠保證被關聯者在關聯對象的生命週期中均可以使用。函數
對於關聯的使用,分爲建立關聯,獲取關聯對象,解除關聯。下面我就會對於以上三個環節進行相應的講解。spa
1.建立關聯指針
在使用關聯的時候,是須要引用#import <objc/runtime.h> 頭文件(運行時函數),在建立關聯的時候是使用objc_setAssociatedObject來實現的。調試
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)該函數須要四個參數:源對象,關鍵字,關聯的對象和一個關聯策略。orm
關鍵字是一個void類型的指針。每個關聯的關鍵字必須是惟一的。一般都是會採用靜態變量來做爲關鍵字。對象
關聯策略代表了相關的對象是經過賦值,保留引用仍是複製的方式進行關聯的;還有這種關聯是原子的仍是非原子的。這裏的關聯策略和聲明屬性時的很相似。這種關聯策略是經過使用預先定義好的常量來表示的。分爲:OBJC_ASSOCIATION_ASSIGN ,OBJC_ASSOCIATION_RETAIN_NONATOMIC ,OBJC_ASSOCIATION_COPY_NONATOMIC,OBJC_ASSOCIATION_RETAIN , OBJC_ASSOCIATION_COPY 。實例以下:three
static char overviewKey;生命週期
NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];ci
NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
以上代碼就將array和overview關聯在一塊兒。建立完關聯,咱們會在其它的地方要經過overviewKey來獲取overview,那接下來,咱們要分析分析,咱們該怎麼樣來經過overviewKey來獲取overview。
2.獲取關聯對象
獲取相關聯的對象時使用Objective-C函數objc_getAssociatedObject(id object, const void *key),對應的參數就是關聯者和關聯關鍵字。代碼實例以下
NSString *overview = objc_getAssociatedObject(array,overviewKey);
3.斷開關聯
斷開關聯有兩種方法,首先,斷開全部的關聯咱們能夠採用objc_removeAssociatedObjects方法。基本上不大建議這種方法,由於這種方法將該對象的其它的相應的關聯也給斷開了,在項目中應用可能會帶來一些之外的bug,而且可能調試起來比較麻煩。那咱們平時須要作的就是經過什麼關鍵字段來創建的關聯,我怕們就應該斷開咱們建立的關聯。那這種方法咱們使用的是objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);咱們給關聯者關聯一個nil值。關聯策略無所謂,問題都不大。
以上是我在項目中使用的一些心得,基本上可以知足通常的項目需求。