iOS中關(guān)聯(lián)對象的簡單使用objc_setAssociatedObject

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);}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容