Objective-C 關聯

 

       在項目開發中,常常會使用到關聯,就是將兩個實例對象綁定,使得其中一個實例對象成爲另外一個實例對象的一部分。關聯特性在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值。關聯策略無所謂,問題都不大。

  以上是我在項目中使用的一些心得,基本上可以知足通常的項目需求。

相關文章
相關標籤/搜索