iOS动态挂载对象整理

来源:互联网 发布:青岛网络电视户外运动 编辑:程序博客网 时间:2024/05/16 10:41

1. 动态关联对象

OBJC_EXPORT void objc_setAssociatedObject(id object,const void * key,id value, objc_AssociationPolicy policy)

1)参数一:id object,被关联对象

2)参数二: const void *key,被关联对象的键值,后期通过此键值获取关联数据id value

3)参数三: id value,被关联对象关联的数据

4)参数四: objc_AssociationPolicy,关联协议

enum {

      OBJC_ASSOCIATION_ASSIGN = 0,

      OBJC_ASSOCIATION_RETAIN_NONATOMIC= 1,

      OBJC_ASSOCIATION_COPY_NONATOMIC = 3,

      OBJC_ASSOCIATION_RETAIN= 01401,

      OBJC_ASSOCIATION_COPY= 01403

};

typedefuintptr_t;objc_AssociationPolicy;

 

以UIAlertView为例:

 

#import<objc/runtime.h> 

static const char kRepresentedObject; 

-(void)showAlert:(id)sender 

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去看看", nil]; 
    alert.tag = ALERT_GOTO_TAG; 
    objc_setAssociatedObject(alert, &kRepresentedObject, 
    @"我是被挂载的"
    OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    [alert show]; 

2.objc_getAssociatedObject 动态获取关联对象

OBJC_EXPORT id objc_getAssociatedObject(id object,const void  * key)

返回值: objc_setAssociatedObject中键(第二个参数)所对应的值id value

 

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
if (buttonIndex == 1) { 
    NSString *str = objc_getAssociatedObject(alertView, &kRepresentedObject); 
        NSLog(@"%@",str) 
}  

2. 移除关联

将id value置为nil,

objc_setAssociatedObject(alert, &kRepresentedObject,  nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
被关联的对象为nil,关联政策也就无所谓了.
 

OBJC_EXPORT void objc_removeAssociatedObjects(id object)

通常情况下不适用这个函数,因为会断开对象所有关联,只在需要把对象恢复到”原始状态”时才调用此函数.

 

 参考资料:http://www.cocoachina.com/cms/wap.php?action=article&id=8570

                http://blog.csdn.net/onlyou930/article/details/9299169

                http://m.blog.csdn.net/blog/csz0102/19555673#

0 0
原创粉丝点击