iOS中關(guān)聯(lián)對象的簡單使用objc_setAssociatedObject
首先看一下此方法接收的參數(shù)
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
被關(guān)聯(lián)的對象,下面舉的例子中關(guān)聯(lián)到了UIAlertView
要關(guān)聯(lián)的對象的鍵值,一般設(shè)置成靜態(tài)的,用于獲取關(guān)聯(lián)對象的值
要關(guān)聯(lián)的對象的值,從接口中可以看到接收的id類型,所以能關(guān)聯(lián)任何對象
關(guān)聯(lián)時采用的協(xié)議,有assign,retain,copy等協(xié)議,具體可以參考官方文檔
具體用法一:
- (void)viewDidLoad {? ??
[superviewDidLoad];
NSString*firsrString =@"我是第一個按鈕";
// ?傳入的對象可以是字符串,字典,數(shù)組類型
NSString*secondString =@"我是第二個按鈕";
UIButton*btn = [[UIButtonalloc] initWithFrame:CGRectMake(100,100,150,50)];? ?
?[btn setBackgroundColor:[UIColorredColor]];? ??
[btn setTitle:@"按鈕傳值"forState:UIControlStateNormal];??
? [self.view addSubview:btn];? ? ??
? objc_setAssociatedObject(btn,"firstObject", firsrString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);? ? objc_setAssociatedObject(btn,"secondObject", secondString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);? ?
?[btn addTarget:selfaction:@selector(click:) forControlEvents:UIControlEventTouchUpInside];}
- (void)click:(UIButton*)sender{
idfirst = objc_getAssociatedObject(sender,"firstObject");
idsecond = objc_getAssociatedObject(sender,"secondObject");
NSLog(@"%@--%@", first, second);
}
解釋一下:
第一步: 設(shè)定關(guān)聯(lián)objc_setAssociatedObject(btn, "firstObject", someObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);第一個參數(shù):btn為被關(guān)聯(lián)者(主體),第二個參數(shù):firstObject為指向關(guān)聯(lián)的對象的指針(一般為一個static字符串),第三個參數(shù):關(guān)聯(lián)的對象實例,第四個對象:關(guān)聯(lián)的方式(有幾種,類似設(shè)定.h文件屬性時候的 assign,retain等)
第二步:得到關(guān)聯(lián)的對象
id first = objc_getAssociatedObject(btn, "firstObject");第一個參數(shù):為被關(guān)聯(lián)者第二個參數(shù):為關(guān)聯(lián)對象的指針。
具體用法二:
tableview 點擊 cell上的編輯按鈕傳值:
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {? ?
?StudioTemplateCell *cell = [tableView dequeueReusableCellWithIdentifier:@"StudioTemplateCellID"];?
?? [cell.editButton addTarget:selfaction:@selector(editClick:) forControlEvents:UIControlEventTouchUpInside];? ? objc_setAssociatedObject(cell.editButton,@"indexPathKey", indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
returncell;}
- (void)editClick:(UIButton*)btn{NSIndexPath*index = objc_getAssociatedObject(btn,@"indexPathKey");NSLog(@"%@", index);}