iOS學習 --- objc_setAssociatedObject 關聯物件
阿新 • • 發佈:2019-01-31
首先看一下此方法接收的引數
設定objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
獲取
id objc_getAssociatedObject(id object, const void *key)
被關聯的物件,下面舉的例子中關聯到了UIAlertView
- 要關聯的物件的鍵值,一般設定成靜態的,用於獲取關聯物件的值
- 要關聯的物件的值,從介面中可以看到接收的id型別,所以能關聯任何物件
- 關聯時採用的協議,有assign,retain,copy等協議,具體可以參考官方文件
下面就以UIAlertView為例子簡單介紹一下使用方法
使用場景:在UITableView中點選某一個cell,這時候彈出一個UIAlertView,然後在UIAlertView消失的時候獲取此cell的資訊,我們就獲取cell的indexPath
第一步:
#import <objc/runtime.h> static char kUITableViewIndexKey; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ...... UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"這裡是xx樓" delegate:self cancelButtonTitle:@"好的" otherButtonTitles:nil]; //然後這裡設定關聯,此處把indexPath關聯到alert上 objc_setAssociatedObject(alert, &kUITableViewIndexKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC); [alert show];
}
第二步:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0) {
NSIndexPath *indexPath = objc_getAssociatedObject(alertView, &kUITableViewIndexKey);
NSLog(@"%@", indexPath);
}
}
其實,實際上這種設定和獲取的方法,就相當於一個全域性的字典,用來存取鍵值對。