您好,登錄后才能下訂單哦!
關聯是指把兩個對象相互關聯起來,使得其中的一個對象作為另外一個對象的一部分。
關聯特性只有在Mac OS X V10.6以及以后的版本上才是可用的。
使用關聯,我們可以不用修改類的定義而為其對象增加存儲空間。這在我們無法訪問到類的源碼的時候或者是考慮到二進制兼容性的時候是非常有用。
關聯是基于關鍵字的,因此,我們可以為任何對象增加任意多的關聯,每個都使用不同的關鍵字即可。關聯是可以保證被關聯的對象在關聯對象的整個生命周期都是可用的(在垃圾自動回收環境下也不會導致資源不可回收)。
創建關聯要使用到Objective-C的運行時函數:objc_setAssociatedObject來把一個對象與另外一個對象進行關聯。該函數需要四個參數:源對象,關鍵字,關聯的對象和一個關聯策略。當然,此處的關鍵字和關聯策略是需要進一步討論的。
■ 關鍵字是一個void類型的指針。每一個關聯的關鍵字必須是唯一的。通常都是會采用靜態變量來作為關鍵字。
■ 關聯策略表明了相關的對象是通過賦值,保留引用還是復制的方式進行關聯的;還有這種關聯是原子的還是非原子的。這里的關聯策略和聲明屬性時的很類似。這種關聯策略是通過使用預先定義好的常量來表示的。
下面的代碼展示了如何把一個字符串關聯到一個數組上。
列表7-1 把一個字符串關聯到一個數組
static char key;
-(void)showInView:(UIView *)view completeBlock:(void (^)(NSInteger btnIndex))block
{
if (block) {
////移除所有關聯
objc_removeAssociatedObjects(self);
/**
1 創建關聯(源對象,關鍵字,關聯的對象和一個關聯策略。)
2 關鍵字是一個void類型的指針。每一個關聯的關鍵字必須是唯一的。通常都是會采用靜態變量來作為關鍵字。
3 關聯策略表明了相關的對象是通過賦值,保留引用還是復制的方式進行關聯的;關聯是原子的還是非原子的。這里的關聯策略和聲明屬性時的很類似。
*/
objc_setAssociatedObject(self, &key, block, OBJC_ASSOCIATION_COPY);
//設置delegate
self.delegate = self;
}
[self showInView:view];
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
//獲取上門關聯的bolck
void (^block)(NSInteger btnIndex) = objc_getAssociatedObject(self, &key);
if (block) block(buttonIndex);
}
/**
OC中的關聯就是在已有類的基礎上添加對象參數。來擴展原有的類,需要引入#import <objc/runtime.h>頭文件。關聯是基于一個key來區分不同的關聯。
常用函數: objc_setAssociatedObject 設置關聯
objc_getAssociatedObject 獲取關聯
objc_removeAssociatedObjects 移除關聯
*/
@end
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。